我们有一个大型 VS 2010 解决方案,主要是 C# 代码,但也有一些各种 C# 项目依赖的本机 DLL(包括我们的单元测试 DLL)。我们正在尝试支持 32 位和 64 位版本的库。因此,我们现在将本机 DLL 构建为 32 位和 64 位。问题是我们的许多 C# 项目都有构建后事件,这些事件会将所需的本机 DLL 复制到项目的 TargetDir 中。现在我们有两个不同版本的本机 DLL(32 位和 64 位),我需要能够指定正确的目录来从中复制本机 DLL。我原本以为我可以简单地在路径中使用 $(Platform) ,如下所示:
copy $(SolutionDir)\NativeDll\$(Platform)\$(Configuration) $(TargetDir)
但这不起作用,因为 $(Platform) 是 project 的 平台,而不是解决方案级别平台。在本例中,$(Platform) 是“任何 CPU”。从我所看到的 C# 项目中的构建后事件宏来看,似乎没有办法访问正在构建的解决方案级别平台。有更好的方法来实现我的目标吗?
我相信解决方案的平台与项目的平台不同,只是文本。
我过去做过的是:
从解决方案中删除 Win32 和“混合平台”(添加项目后继续这样做)。
将所有 C# DLL 设置为在解决方案平台 AnyCPU、x86、x64 中构建为 AnyCPU。 (如果您希望能够在 Blend 中打开或者解决方案中有任何纯托管应用程序,请不要删除 AnyCPU。)
将 C# EXE 和单元测试设置为在 x86 解决方案平台中构建于 x86 中,以及在 x64 解决方案平台中构建于 x64 中,而根本不在 AnyCPU 解决方案平台中构建。
当解决方案为 x86 时,将所有本机设置为在 Win32 中构建,并输出到 \x86$(Configuration) 中的 $(ProjectDir) 并中间与路径中的 obj 而不是 bin 相同。 x64 与 x64 相同,而不是 x86 和 Win32。
设置 C# EXE 和单元测试的预构建事件,以从项目配置名称的相对路径复制它们所依赖的本机 DLL:$(Config)
设置单元测试的类初始化以将测试 bin 目录的全部内容(当然是正确的平台和配置)复制到测试的输出目录。使用 if #DEBUG 和 unsafe sizeof(IntPtr) 来告诉在哪里寻找测试的 bin 目录。
手动(使用记事本)添加到解决方案外部使用解决方案部署位置中的 x86/x64 程序集的 .csproj 文件的相对引用路径,因此路径将包含 $(Platform) 和 $(Configuration),并且不会针对每个用户。
Microsoft:Visual Studio 中更好的 32/64 位支持将真正到位。
当我必须这样做时,我只是将所有程序集都可构建为 x86 或 x64 而不是 AnyCPU,并且有两个单独的输出包。如果您知道自己的进程必须是 32 位或 64 位,那么 AnyCPU 确实没有任何意义。
我自己没有使用过它,但是“构建”->“批量构建”可能就是您想要的。有了它,您可以构建多个平台。
http://msdn.microsoft.com/en-us/library/169az28z.aspx
当然,这实际上并不能让您访问解决方案的“平台”,但您不需要这样做,因为您将单独构建每个平台。
更新: 如果您想自动化构建,请创建一个包含以下内容的批处理文件
"c:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv" ../solution.sln /rebuild "platform"
其中“平台”是“Release|Any CPU”、“Release|x86”等,并对需要构建的每个配置重复该行。使用配置管理器为 x86 和 x64 的构建设置每个项目,您应该拥有您想要的。
我认为“活动解决方案配置”没有等效的宏属性。
我的建议是在所有 .csproj 文件中手动添加自定义属性,如下所示(请参阅为每个配置/平台组合添加的新
MyVar
自定义属性):
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
...
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
...
<MyVar>MyDebugAnyCpu</MyVar>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
...
<MyVar>MyReleaseAnyCpu</MyVar>
</PropertyGroup>
您可以在 Visual Studio 中使用“卸载项目”和“编辑 MyProject.csproj”菜单来编辑 .csprojet。重要的是要知道,即使您使用普通 GUI 编辑器保存这些“未知”值,Visual Studio 也不会破坏它们。
然后在构建后事件中,您可以使用这些值,例如:
copy $(SolutionDir)\$(MyVar)\$(Platform)\$(Configuration) $(TargetDir)
Francesco Pretto 有一个扩展可以帮助解决这个问题。它似乎有一些怪癖和缺陷,但这是一个开始。
http://visualstudiogallery.msdn.microsoft.com/619d92a2-4ead-410d-a105-135f7b4b4df9
在 github 上有源代码: