当前位置: 首页 > news >正文

在 csproj 文件中使用系统环境变量的值(示例将 dll 生成到 AppData 目录下)

Windows 系统以及很多应用程序会考虑使用系统的环境变量来传递一些公共的参数或者配置。Windows 资源管理器使用 %var% 来使用环境变量,那么我们能否在 Visual Studio 的项目文件中使用环境变量呢?

本文介绍如何在 csproj 文件中使用环境变量。


本文内容

    • 遇到的问题
    • 在 Visual Studio 中修改输出路径

遇到的问题

在 Windows 资源管理器中,我们可以使用 %AppData% 进入到用户的漫游路径。我正在为 希沃白板5 为互动教学而生 - 课件制作神器 编写插件,于是需要将插件放到指定目录:

%AppData%\Seewo\EasiNote5\Walterlv.Presentation

在 Windows 资源管理器中可以直接输入以上文字进入对应的目录(当然需要确保存在)。

插件目录

更多关于路径的信息可以参考:UWP 中的各种文件路径(用户、缓存、漫游、安装……) - walterlv

然而,为了调试方便,我最好在 Visual Studio 中编写的时候就能直接输出到插件目录。

于是,我需要将 Visual Studio 的调试目录设置为以上目录,但是以上目录中包含环境变量 %AppData%

在 Visual Studio 中修改输出路径

如果直接在 csproj 中使用 %AppData%,那么 Visual Studio 会原封不动地创建一个这样的文件夹。

一个诡异的文件夹

实际上,Visual Studio 是天然支持环境变量的。直接使用 MSBuild 获取属性的语法即可获取环境变量的值。

也就是说,使用 $(AppData) 即可获取到其值。在我的电脑上是 C:\Users\lvyi\AppData\Roaming

于是,在 csproj 中设置 OutputPath 即可正确输出我的插件到目标路径。

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <TargetFrameworks>net472</TargetFrameworks>
        <OutputPath>$(AppData)\Seewo\EasiNote5\Extensions\Walterlv.Presentation</OutputPath>
        <AppendTargetFrameworkToOutputPath>False</AppendTargetFrameworkToOutputPath>
    </PropertyGroup>
</Project>

这里,我额外设置了 AppendTargetFrameworkToOutputPath 属性,这是避免 net472 出现在了目标输出路径中。你可以阅读我的另一篇博客了解更多关于输出路径的问题:

  • 如何更精准地设置 C# / .NET Core 项目的输出路径?(包括添加和删除各种前后缀) - walterlv

我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

知识共享许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

相关文章:

  • git subtree 的使用
  • 让你的 VSCode 具备调试 C# 语言 .NET Core 程序的能力
  • 手工编辑 tasks.json 和 launch.json,让你的 VSCode 具备调试 .NET Core 程序的能力
  • C#/.NET 如何结束掉一个进程
  • C#/.NET 移动或重命名一个文件夹(如果存在,则合并而不是出现异常报错)
  • 如何创建应用程序清单文件 App.Manifest,如何创建不带清单的应用程序
  • 应用程序清单 Manifest 中各种 UAC 权限级别的含义和效果
  • 启用 Windows 审核模式(Audit Mode),以 Administrator 账户来设置电脑的开箱体验
  • Windows 中的 UAC 用户账户控制
  • Windows 下使用 runas 命令以指定的权限启动一个进程(非管理员、管理员)
  • Windows 的 UAC 设置中的通知等级实际上只有两个档而已
  • Windows 系统上使用任务管理器查看进程的各项属性(命令行、DPI、管理员权限等)
  • C#/.NET 如何获取一个异常(Exception)的关键特征,用来判断两个异常是否表示同一个异常
  • C#/.NET 如何在第一次机会异常 FirstChanceException 中获取比较完整的异常堆栈
  • C#/.NET 使用 git 命令行来操作 git 仓库
  • 2017-08-04 前端日报
  • CSS魔法堂:Absolute Positioning就这个样
  • GraphQL学习过程应该是这样的
  • JavaScript设计模式系列一:工厂模式
  • js 实现textarea输入字数提示
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • Vue 2.3、2.4 知识点小结
  • webpack+react项目初体验——记录我的webpack环境配置
  • 每天一个设计模式之命令模式
  • 思否第一天
  • 通过几道题目学习二叉搜索树
  • 微信小程序:实现悬浮返回和分享按钮
  • 做一名精致的JavaScripter 01:JavaScript简介
  • gunicorn工作原理
  • 阿里云重庆大学大数据训练营落地分享
  • ​ArcGIS Pro 如何批量删除字段
  • ​Linux·i2c驱动架构​
  • ​决定德拉瓦州地区版图的关键历史事件
  • # Maven错误Error executing Maven
  • #pragma data_seg 共享数据区(转)
  • #pragma 指令
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (39)STM32——FLASH闪存
  • (AngularJS)Angular 控制器之间通信初探
  • (poj1.3.2)1791(构造法模拟)
  • (TOJ2804)Even? Odd?
  • (简单) HDU 2612 Find a way,BFS。
  • (一)Thymeleaf用法——Thymeleaf简介
  • (转)iOS字体
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .gitignore
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .Net Core与存储过程(一)
  • .net framework profiles /.net framework 配置
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .net开发引用程序集提示没有强名称的解决办法
  • @GlobalLock注解作用与原理解析
  • [<事务专题>]
  • [AAuto]给百宝箱增加娱乐功能
  • [android] 天气app布局练习