在Visual Studio中构build时,有条件地使用32/64位参考
我有一个项目,build立在32/64位,并具有相应的32/64位依赖项。 我希望能够切换configuration并使用正确的引用,但我不知道如何告诉Visual Studio使用体系结构适当的依赖关系。
也许我这样做是错误的,但我希望能够在configuration下拉菜单中切换x86和x64,并且引用的DLL是正确的。
这是我在之前的项目中所做的,这将需要手动编辑.csproj文件。 您还需要不同的二进制文件的目录,理想的是彼此的兄弟姐妹,并与您定位的平台名称相同。
在添加单个平台对项目的引用后,在文本编辑器中打开.csproj。 在<Project>
元素中的第一个<ItemGroup>
元素之前,添加以下代码,这将有助于确定您正在运行(和构build)的平台。
<!-- Properties group for Determining 64bit Architecture --> <PropertyGroup> <CurrentPlatform>x86</CurrentPlatform> <CurrentPlatform Condition="'$(PROCESSOR_ARCHITECTURE)'=='AMD64' or '$(PROCESSOR_ARCHITEW6432)'=='AMD64'">AMD64</CurrentPlatform> </PropertyGroup>
然后,针对您的平台特定参考,您进行如下更改:
<ItemGroup> <Reference Include="Leadtools, Version=16.5.0.0, Culture=neutral, PublicKeyToken=9cf889f53ea9b907, processorArchitecture=x86"> <SpecificVersion>False</SpecificVersion> <HintPath>..\..\Lib\Leadtools\$(CurrentPlatform)\Leadtools.dll</HintPath> </Reference> <Reference Include="Leadtools.Codecs, Version=16.5.0.0, Culture=neutral, PublicKeyToken=9cf889f53ea9b907, processorArchitecture=x86"> <SpecificVersion>False</SpecificVersion> <HintPath>..\..\Lib\Leadtools\$(CurrentPlatform)\Leadtools.Codecs.dll</HintPath> </Reference> <Reference Include="Leadtools.ImageProcessing.Core, Version=16.5.0.0, Culture=neutral, PublicKeyToken=9cf889f53ea9b907, processorArchitecture=x86"> <SpecificVersion>False</SpecificVersion> <HintPath>..\..\Lib\Leadtools\$(CurrentPlatform)\Leadtools.ImageProcessing.Core.dll</HintPath> </Reference> <Reference Include="System" /> <Reference Include="System.Core" /> <Reference Include="System.Data.Entity" /> <!-- Other project references --> </ItemGroup>
请注意使用上面定义的$(CurrentPlatform)
属性。 你可以,而是使用哪些组件包含哪些平台的条件。 您可能还需要:
- 用
$(Platform)
replace$(PROCESSOR_ARCHITEW6432)
和$(PROCESSOR_ARCHITECTURE)
,只考虑项目的目标平台 - 修改平台确定逻辑以适合当前机器,这样就不会构build/引用在32位平台上执行的64位二进制文件。
我原来写了一个内部Wiki,但是,如果您对详细的分步说明感兴趣,我已经修改了它并将完整的stream程发布到了我的博客 。
AFAIK,如果您的项目需要32位或64位特定的引用(即COM互操作程序集),并且您没有兴趣手动编辑.csproj文件,则必须创build单独的32位和64位项目。
我应该注意下面的解决scheme是未经testing的,但应该工作。 如果您愿意手动编辑.csproj文件,那么您应该可以通过一个项目来获得所需的结果。 .csproj文件只是一个MSBuild脚本,所以要全面参考,请看这里 。 一旦在编辑器中打开.csproj文件,find<Reference>
元素。 您应该能够将这些元素分成3个不同的项目组 :不是特定于平台的引用,特定于x86的引用和特定于x64的引用。
这是一个假设您的项目configuration了名为“x86”和“x64”的目标平台的示例
<!-- this group contains references that are not platform specific --> <ItemGroup> <Reference Include="System" /> <Reference Include="System.Core" /> <!-- any other references that aren't platform specific --> </ItemGroup> <!-- x86 specific references --> <ItemGroup Condition=" '$(Platform)' == 'x86' "> <Reference Include="MyComAssembly.Interop"> <HintPath>..\..\lib\x86\MyComAssembly.Interop.dll</HintPath> </Reference> <!-- any additional x86 specific references --> </ItemGroup> <!-- x64 specific referneces --> <ItemGroup Condition=" '$(Platform)' == 'x64' "> <Reference Include="MyComAssembly.Interop"> <HintPath>..\..\lib\x64\MyComAssembly.Interop.dll</HintPath> </Reference> <!-- any additional x64 specific references --> </ItemGroup>
现在,当您将项目/解决scheme构buildconfiguration设置为x86或x64平台的目标时,应该在每种情况下都包含适当的引用。 当然,你需要玩弄<Reference>
元素。 您甚至可以在添加x86和x64引用的位置设置虚拟项目,然后将必要的<Reference>
元素从这些虚拟项目文件复制到“真实”项目文件中。
编辑1
这是一个常见的MSBuild项目项目的链接,我不小心从原始文章中遗漏了: http : //msdn.microsoft.com/en-us/library/bb629388.aspx
您可以使用项目文件中的dll引用的ItemGroup条件。
这将导致Visual Studio在您更改活动configuration时重新检查条件和引用。
只需为每个configuration添加一个条件。
例:
<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' "> <Reference Include="DLLName"> <HintPath>..\DLLName.dll</HintPath> </Reference> <ProjectReference Include="..\MyOtherProject.vcxproj"> <Project>{AAAAAA-000000-BBBB-CCCC-TTTTTTTTTT}</Project> <Name>MyOtherProject</Name> </ProjectReference> </ItemGroup>
我在我的项目中引用位于例如\ component \ v3_NET4中的x86 DLL。 x86 / x64的特定DLL位于名为“x86”和“x64”的子文件夹中。
然后,我使用预生成脚本,根据$(PlatformName)将适当的DLL(x86 / x64)复制到引用的文件夹中。
xcopy /s /e /y "$(SolutionDir)..\component\v3_NET4\$(PlatformName)\*" "$(SolutionDir)..\component\v3_NET4"
为我工作。
我面临同样的问题,花了很长时间寻找一个体面的解决scheme。 大多数人提供Visual Studio解决scheme文件的手动编辑,之后在Visual Studio GUI中浏览这些编辑的文件时,这是非常繁琐,容易出错和混淆的。 当我已经放弃的时候,解决scheme就出现了。 这和Micke在他上面的回答中所推荐的非常相似。
在帐户pipe理器中,我像往常一样为x86和x64平台创build了两个独立的构build目标。 接下来,我添加了对x86程序集的引用到我的项目中。 在这一点上,我相信该项目只configurationx86构build,并将永远不会build立x64configuration,除非我会按照Hugo上面的build议手动编辑它。
过了一会儿,我终于忘记了这个限制,并无意中启动了x64 build。 当然,构build失败。 但重要的是我收到的错误信息。 错误消息告诉我,作为我的解决scheme的x64生成目标的文件夹中缺less完全按照我引用的x86程序集命名的程序集。
注意到这一点,我已经手动将适当的x64程序集复制到此目录中。 荣耀! 我的x64构build奇迹般地成功地find并隐式链接。 修改我的解决scheme将x64程序集的构build目标目录设置到此文件夹是几分钟的事情。 完成这些步骤后,解决scheme将自动为x86和x64构build,而无需手动编辑MSBuild文件。
总结一下:
- 在一个项目中创buildx86和x64目标
- 将所有适当的项目引用添加到x86程序集
- 为所有x64程序集设置一个公共构build目标目录
- 如果您已经准备好x64程序集,只需将它们复制一次到x64 build目标目录中即可
完成这些步骤后,您的解决scheme将针对x86和x64configuration进行正确构build。
这适用于Visual Studio 2010 .NET 4.0 C#项目。 显然,这是Visual Studio的一种无证的内部行为,可能会在2012,2013和2015版本中发生变化。 如果有人会尝试其他版本,请分享您的经验。