Visual studio MSBuild ProjectC中的条件引用,基于运行的是ProjectA还是ProjectB

Visual studio MSBuild ProjectC中的条件引用,基于运行的是ProjectA还是ProjectB,visual-studio,msbuild,xamarin-studio,Visual Studio,Msbuild,Xamarin Studio,我的解决方案中有三个项目: ProjectA : contains reference to ProjectC ProjectB : contains reference to ProjectC ProjectC : references third.party.dll.A or third.party.dll.B 在编译过程中,我希望Project C引用第三方.dll.A或第三方.dll.B,具体取决于我已将哪个项目A或项目B设置为启动项目,并通过IDE启动/编译 如何设置解决方案,以便在

我的解决方案中有三个项目:

ProjectA : contains reference to ProjectC
ProjectB : contains reference to ProjectC
ProjectC : references third.party.dll.A or third.party.dll.B
在编译过程中,我希望Project C引用第三方.dll.A第三方.dll.B,具体取决于我已将哪个项目A或项目B设置为启动项目,并通过IDE启动/编译

如何设置解决方案,以便在ProjectC.csproj中使用MSBuild条件引用来确定当前是否正在编译ProjectA或ProjectB

(在.csproj文件中,我尝试检查$(DefineConstants)是否包含某个值,但似乎$(DefineConstants)只包含ProjectC中定义的符号,而不包含ProjectA和ProjectB中定义的符号。)


(仅供参考:我正在Mac电脑上使用Xamarin Studio。但我假设如果有办法让它在Visual Studio上工作,它也应该在Xamarin Studio中工作。)

不,您不能这样做。MSBuild中的项目引用无法配置为所需的扩展,引用项目的生成配置是在标准MSBuild.targets文件中硬编码的

对于您的案例,有两种可能的解决方法。最简单的方法是创建两个项目:
ProjectC1
ProjectC2
。C1将使用其中一个第三方库,而C2将使用另一个。您可以使
ProjectC1
ProjectC2
共享相同的源文件,这样就不会有代码重复

另一种可能的解决方法是使用条件赋值引用
第三方.dll.A
第三方.dll.B
,如下所示:

<ItemGroup>
  <ProjectReference Condition="'$(BuildA)' == 'true'" Include="pathto\third.party.dll.A">
    <Name>third.party.dll.A</Name>
  </ProjectReference>
  <ProjectReference Condition="'$(BuildB)' == 'true'" Include="pathto\third.party.dll.B">
    <Name>third.party.dll.B</Name>
  </ProjectReference>
</ItemGroup>


要使构建在VisualStudio或XamarinStudio中像这样工作,必须在启动VS或XS之前设置环境变量。请注意,如果不重新启动VS或XS,就无法从一种配置切换到另一种配置。

我最喜欢ProjectC1和ProjectC2的想法,因为我是通过Xamarin Studio而不是命令行进行编译的。但是,您是否知道是否有一种方法可以使C1和C2“共享”相同的源文件,同时将源文件保存在Xamarin中,并使用“可移植库”而不是“共享项目”。(我需要将代码放在可移植库中的原因是我在使用共享项目时遇到了另一个问题。)@AnthonyTietjen,您应该能够轻松地在项目之间共享源代码。我用.csproj做这件事是很久以前的事了,但我一直在用.vcxproj做这件事。使用C#最简单的方法是将两个.csproj文件放在同一个目录中,这样VS或Xamarin就不会希望在两个不同的位置复制文件。对于C++项目,可以通过编辑.vcxPROJ文件和调整代码< > /Cord>项目来实现相同的用途,使用您希望的位置。@ AthoNoTiTejEN——关于在两个项目之间共享源代码的另一件事。您可能需要为这两个项目分配不同的$(IntDir)值,以便它们不会混淆中间结果。$(OutDir)可能是相同的,我假设您希望输出的名称不同。如果希望DLL具有相同的名称,请将$(OutDir)也指定给指向不同位置的对象。
> msbuild ProjectA.csproj /p:BuildA=true
> msbuild ProjectB.csproj /p:BuildB=true