如何在C#应用内获取并显示Visual Studio发布系统中的PublishUrl
获取C#项目中的PublishUrl并显示在帮助菜单里
我明白你的需求——就是想把.csproj里的PublishUrl路径拿到应用里,在帮助菜单显示出来,方便用户排查自动更新的网络权限问题对吧?这个其实不难,核心是把MSBuild的PublishUrl属性传递到C#代码里,下面给你两种简单可靠的实现方式:
方式一:通过配置文件注入(推荐,适用于.NET Framework/.NET Core/.NET 5+)
这种方式最稳妥,不会有字符串转义的问题,步骤也简单:
1. 修改配置文件
- 如果是**.NET Framework**:打开
App.config,在<appSettings>节点里加一行:
<appSettings> <add key="PublishUrl" value="$(PublishUrl)" /> </appSettings>
- 如果是**.NET Core/.NET 5+**:打开
appsettings.json,添加对应的键值对:
{ "PublishUrl": "$(PublishUrl)" }
2. 修改.csproj文件让编译时替换变量
打开你的项目.csproj文件,在里面添加下面的配置,让MSBuild在编译时把$(PublishUrl)替换成实际的路径:
<ItemGroup> <!-- 针对.NET Framework的App.config --> <None Update="App.config"> <TransformOnBuild>true</TransformOnBuild> </None> <!-- 针对.NET Core的appsettings.json(如果用的是这个就保留) --> <None Update="appsettings.json"> <TransformOnBuild>true</TransformOnBuild> </None> </ItemGroup>
3. 在C#代码里读取并显示
- .NET Framework:用
ConfigurationManager读取:
using System.Configuration; // 在帮助菜单的点击事件里写这段代码 string publishUrl = ConfigurationManager.AppSettings["PublishUrl"]; string info = $"Publish URL is {publishUrl}"; DialogResult res = MessageBox.Show(info, "Help", MessageBoxButtons.OK, MessageBoxIcon.Information);
- .NET Core/.NET 5+:用配置构建器读取:
using Microsoft.Extensions.Configuration; // 先构建配置对象(可以在启动时初始化一次,不用每次都构建) var config = new ConfigurationBuilder() .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .Build(); // 帮助菜单事件里的代码 string publishUrl = config["PublishUrl"]; string info = $"Publish URL is {publishUrl}"; MessageBox.Show(info, "Help", MessageBoxButtons.OK, MessageBoxIcon.Information);
方式二:通过预编译常量注入(更直接,适合简单场景)
如果你不想改配置文件,也可以直接把PublishUrl作为预编译常量注入到代码里:
1. 修改.csproj文件
在现有的<PropertyGroup>里添加一行,把PublishUrl定义成预编译常量:
<PropertyGroup> <PublishUrl>\\server\Share\xxx\yyy\AppName\</PublishUrl> <!-- 把PublishUrl包装成C#字符串常量,注意加@避免转义问题 --> <DefineConstants>PUBLISH_URL=@"$(PublishUrl)";$(DefineConstants)</DefineConstants> </PropertyGroup>
2. 在C#代码里直接使用
现在你可以直接在代码里用PUBLISH_URL这个常量了:
string info = $"Publish URL is {PUBLISH_URL}"; DialogResult res = MessageBox.Show(info, "Help", MessageBoxButtons.OK, MessageBoxIcon.Information);
为什么之前的代码里PublishUrl未定义?
因为PublishUrl是MSBuild的项目属性,只在编译过程中有效,不是C#代码里的变量,所以直接写会报错。上面两种方式都是把这个编译时的属性值传递到运行时的代码里,这样就能正常访问啦。
内容的提问来源于stack exchange,提问作者Steven Grunza
相关产品推荐
相关产品推荐

