如何使用MSBuild.exe在构建时设置C#项目的应用程序属性
问题核心原因
你直接给MSBuild传WhichApp参数不会生效的原因是:项目中通过「属性-设置」创建的Properties.Settings类的默认值是固化在app.config和编译后的资源文件中的,MSBuild的全局属性不会自动同步到Settings的默认值配置中。
你现有动态生成代码方案的问题修复
你参考的自动生成配置类的思路是可行的,执行失败是几个配置错误导致的,按以下步骤修正即可:
- 修正MSBuild调用命令
你错误地将.csproj.user作为构建目标,实际要构建的是主项目文件.csproj,正确的命令格式如下:
"C:\Program Files(x86)\Microsoft Visual Studio\2017\WDExpress\MSBuild\15.0\Bin\MSBuild.exe" SelectApp.csproj /p:PcAppConfig=SUB /p:VersionNum=1.0.0.67 /p:Configuration=Debug /p:Platform="Any CPU"
- 修正构建目标逻辑
建议把BeforeBuild逻辑从.csproj.user移到主项目文件.csproj中(.csproj.user是本地个人配置,提交代码时不会同步,容易在其他环境失效),同时修改转义逻辑避免生成语法错误的代码,修正后的BeforeBuild代码如下:
<Target Name="BeforeBuild"> <PropertyGroup> <!--默认值--> <PcAppConfig Condition="'$(PcAppConfig)' == ''">PCB</PcAppConfig> <VersionNum Condition="'$(VersionNum)' == ''">1.0.0.66</VersionNum> <!--用CDATA避免转义问题,直接写合法C#代码--> <TheSourceCode><![CDATA[ internal static class PCAppConfig { public static readonly string value = "$(PcAppConfig)"; } internal static class VersionNum { public static readonly string value = "$(VersionNum)"; } ]]></TheSourceCode> </PropertyGroup> <!--读取现有源代码,仅在需要变更时重写--> <ReadLinesFromFile File="PcAppConfig.cs" ContinueOnError="True"> <Output TaskParameter="Lines" ItemName="CurrentSourceCode" /> </ReadLinesFromFile> <WriteLinesToFile File="PcAppConfig.cs" Overwrite="True" Lines="$(TheSourceCode)" Condition="'@(CurrentSourceCode)' != '$(TheSourceCode)'" /> <!--确保生成的文件被加入编译列表--> <ItemGroup> <Compile Include="PcAppConfig.cs" Condition="!Exists('@(Compile)')" /> </ItemGroup> </Target>
- 修正业务代码调用逻辑
不要再使用Properties.Settings.Default读取配置,直接调用生成的静态类即可,修改后的窗体Load代码如下:
if (PCAppConfig.value == "PCB") { // 创建PCB窗体 PCBForm.ShowDialog(); } else if (PCAppConfig.value == "SUB") { // 创建SUB窗体 SUBForm.ShowDialog(); }
- 安装项目构建问题修正
你AfterCompile目标里的devenv路径写死了VS2019的路径,如果你用的是VS2017要对应修改路径,也可以改用VS安装目录的环境变量来适配不同环境,同时建议把vdproj的绝对路径改为相对于项目目录的相对路径。
内容的提问来源于stack exchange,提问作者GRF
相关产品推荐
相关产品推荐

