Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.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
C# 在MSBuild和Visual Studio中修改引用项目的DefineConstants_C#_Visual Studio_Msbuild_Build Process_Conditional Compilation - Fatal编程技术网

C# 在MSBuild和Visual Studio中修改引用项目的DefineConstants

C# 在MSBuild和Visual Studio中修改引用项目的DefineConstants,c#,visual-studio,msbuild,build-process,conditional-compilation,C#,Visual Studio,Msbuild,Build Process,Conditional Compilation,我有一个带有windows phone类库项目BaseProj的解决方案,以及几个引用此项目、项目a、B等的WP项目。BaseProj有一个LocationHelper类 假设项目A需要BaseProj使用LocationHelper类进行编译,但是项目B应该在没有ID_CAP_LOCATION-capability的情况下构建,因此在构建BaseProj时不应该包含LocationHelper类 我可以通过条件编译符号来实现这一点,问题是:如何根据我是在构建项目A还是B,使用适当的符号来构建B

我有一个带有windows phone类库项目BaseProj的解决方案,以及几个引用此项目、项目a、B等的WP项目。BaseProj有一个LocationHelper类

假设项目A需要BaseProj使用LocationHelper类进行编译,但是项目B应该在没有ID_CAP_LOCATION-capability的情况下构建,因此在构建BaseProj时不应该包含LocationHelper类

我可以通过条件编译符号来实现这一点,问题是:如何根据我是在构建项目A还是B,使用适当的符号来构建BaseProj

经过一些研究,我提出了以下解决方案,在BaseProj.csproj中,我添加了

<PropertyGroup Condition=" '$(TestProperty)'==true ">
  <DefineConstants>$(DefineConstants);TEST_SYMBOL</DefineConstants>
</PropertyGroup>

美元(定义常量);测试符号
在B.csproj中,项目参考中的财产:

<ProjectReference Include="..\BaseProj\BaseProj.csproj">
  <Project>{...}</Project>
  <Name>BaseProj</Name>
  <Properties>TestProperty=true</Properties>
</ProjectReference>

{...}
BaseProj
TestProperty=true
认为在使用B而不是A构建时应该添加
TEST\u符号
。这在使用MSBuild构建时效果非常好。另一方面,VisualStudio完全忽略了这一点,这意味着在调试和使用构建脚本进行发布构建时,我会得到不同的行为


如何从MSBuild和Visual Studio中获得所需的行为?

这可以通过定义新的项目配置来实现。假设您已经有调试和发布配置,并且它们配置了ID\u CAP\u位置,您可以创建新的配置,例如:调试位置和发布位置。这是在VisualStudio的“配置管理器”对话框中完成的。除了项目配置之外,还要定义相应的解决方案配置,以便更容易从VisualStudio构建它。之后,从调试位置/发布位置配置中删除ID位置

必须编辑解决方案中的所有项目,并确保中间位置和二进制文件位置与其调试/发布配置不同,否则您将遇到在配置之间混合二进制文件的问题,从而使增量生成不可靠

如果您想从VSIDE构建两种风格(带位置和不带位置),则必须在配置之间手动切换。但是,可以从命令行创建调用MSBuild.exe两次的简单脚本。例如:

msbuild MySolution.sln /p:Configuration=Debug
msbuild MySolution.sln /p:Configuration=Debug_No_Location

这可以通过定义新的项目配置来实现。假设您已经有调试和发布配置,并且它们配置了ID\u CAP\u位置,您可以创建新的配置,例如:调试位置和发布位置。这是在VisualStudio的“配置管理器”对话框中完成的。除了项目配置之外,还要定义相应的解决方案配置,以便更容易从VisualStudio构建它。之后,从调试位置/发布位置配置中删除ID位置

必须编辑解决方案中的所有项目,并确保中间位置和二进制文件位置与其调试/发布配置不同,否则您将遇到在配置之间混合二进制文件的问题,从而使增量生成不可靠

如果您想从VSIDE构建两种风格(带位置和不带位置),则必须在配置之间手动切换。但是,可以从命令行创建调用MSBuild.exe两次的简单脚本。例如:

msbuild MySolution.sln /p:Configuration=Debug
msbuild MySolution.sln /p:Configuration=Debug_No_Location

我提出了一个既适用于MSBuild又适用于VisualStudio的新解决方案

首先,如果定义了条件编译符号
INCLUDE\u location\u api
,则将BaseProj设置为使用location api构建

将项目A和B设置为使用执行powershell脚本pre-build.ps1的预生成事件进行生成。(请参阅)

pre-build.ps1将读取当前项目的清单,以确定其是否具有定位功能(
ID\u CAP\u location
),以及BaseProj调试和发布配置是否定义了
包含位置API
。如有必要,将添加或删除
INCLUDE\u LOCATION\u API
。由于这将修改BaseProj.csproj,因此生成脚本将退出并显示错误代码,以防止生成完成

当我从VS构建时,如果BaseProj有正确的配置,它将正常构建。如果配置错误,则会修改BaseProj.csproj,生成失败,但下一次生成将成功

在构建脚本中,我在实际构建之前执行一次pre-build.ps1,以确保项目具有正确的配置。然后执行MSBuild并成功构建项目


<>我不考虑这种最佳实践,但它完成了任务,我不需要考虑在项目之间切换时应该使用什么配置。

< P>我提出了一种新的解决方案,既适用于MSBudio又适用于VisualStudio。

首先,如果定义了条件编译符号
INCLUDE\u location\u api
,则将BaseProj设置为使用location api构建

将项目A和B设置为使用执行powershell脚本pre-build.ps1的预生成事件进行生成。(请参阅)

pre-build.ps1将读取当前项目的清单,以确定其是否具有定位功能(
ID\u CAP\u location
),以及BaseProj调试和发布配置是否定义了
包含位置API
。如有必要,将添加或删除
INCLUDE\u LOCATION\u API
。由于这将修改BaseProj.csproj,因此生成脚本将退出并显示错误代码,以防止生成完成

当我从VS构建时,如果BaseProj有正确的配置,它将正常构建。如果配置错误,则会修改BaseProj.csproj,生成失败,但下一次生成将成功

在我的构建脚本中,我在实际构建之前执行一次pre-build.ps1,以确保项目