Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将数据传递给csproj,或者如何在C#.netFramework项目中的新构建配置上使用#if指令_C#_Msbuild_Csproj - Fatal编程技术网

如何将数据传递给csproj,或者如何在C#.netFramework项目中的新构建配置上使用#if指令

如何将数据传递给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

我想创建一个.NETFramework web表单项目的条件编译,因为我想用两种不同的方式构建该项目。 我想创造这样的东西:

#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