如何将数据传递给csproj,或者如何在C#.netFramework项目中的新构建配置上使用#if指令
我想创建一个.NETFramework web表单项目的条件编译,因为我想用两种不同的方式构建该项目。 我想创造这样的东西:如何将数据传递给csproj,或者如何在C#.netFramework项目中的新构建配置上使用#if指令,c#,msbuild,csproj,C#,Msbuild,Csproj,我想创建一个.NETFramework web表单项目的条件编译,因为我想用两种不同的方式构建该项目。 我想创造这样的东西: #if X Console.WriteLine("executeCodeX"); #else Console.WriteLine("executeCodeY"); #endif 其中,X应在msbuild文件中定义为属性,以便我可以选择生成为X或生成为Y。 我想到了以下两种解决方案: 1) 为buildX创建一个新的生成配置,并在msbuild中使用bu
#if X
Console.WriteLine("executeCodeX");
#else
Console.WriteLine("executeCodeY");
#endif
其中,X应在msbuild文件中定义为属性,以便我可以选择生成为X或生成为Y。
我想到了以下两种解决方案:
1) 为buildX创建一个新的生成配置,并在msbuild中使用buildX配置调用msbuild命令。这个解决方案的问题是,我不知道如何在我的代码中知道我正在执行的配置(我无法定义#if X,因为X无法识别)
2) 在msbuild中创建一个属性,并以某种方式将其传递给csproj,但同样,我不知道如何在代码中访问该属性,以判断我是否在X中执行
解决方案的正确方法是什么?您需要使用MSBuild属性“DefineConstants”
您可以在csproj(单个项目)文件或Directory.Build.props文件(整个解决方案)中设置/修改它,或者仅将其指定为命令行参数。这完全取决于你希望事情如何运作 如果要在proj/props文件中指定它,请尝试在项目标记末尾的项目标记之前放置类似的内容:
使用代理属性可以更轻松地添加更多定义的常量,切换默认值,并在将来分别打开和关闭它们
<PropertyGroup>
<UseX>false</UseX>
<DefineConstants Condition="'$(UseX)' == 'true'">X;$(DefineConstants)</DefineConstants>
</PropertyGroup>
假的
X$(定义常量)
false
并不是必须的,但是感觉稍微完整一些
然后,如果要生成它,请使用以下选项在禁用X的情况下进行生成:
msbuild <proj/sln file>
msbuild
在X上:
msbuild <proj/sln file> /p:UseX=true
msbuild/p:UseX=true
或者,最简单但灵活性很小的选项是仅在命令行中指定:
msbuild <proj/sln file> /p:DefineConstants=X
msbuild/p:DefineConstants=X
您需要使用MSBuild属性“DefineConstants”您可以在csproj(单个项目)文件或Directory.Build.props文件(整个解决方案)中设置/修改它,或者仅将其指定为命令行参数。这完全取决于你希望事情如何运作 如果要在proj/props文件中指定它,请尝试在项目标记末尾的项目标记之前放置类似的内容:
使用代理属性可以更轻松地添加更多定义的常量,切换默认值,并在将来分别打开和关闭它们
<PropertyGroup>
<UseX>false</UseX>
<DefineConstants Condition="'$(UseX)' == 'true'">X;$(DefineConstants)</DefineConstants>
</PropertyGroup>
假的
X$(定义常量)
false
并不是必须的,但是感觉稍微完整一些
然后,如果要生成它,请使用以下选项在禁用X的情况下进行生成:
msbuild <proj/sln file>
msbuild
在X上:
msbuild <proj/sln file> /p:UseX=true
msbuild/p:UseX=true
或者,最简单但灵活性很小的选项是仅在命令行中指定:
msbuild <proj/sln file> /p:DefineConstants=X
msbuild/p:DefineConstants=X