在 Visual Studio 中巧妙构建多平台解决方案
这里有一个技巧,可以创建一个 Visual Studio 解决方案,同时为目标项目构建多个平台。
引言
为了支持 WiX 安装项目,我需要为 32 位 (x86) 和 64 位 (x64) 平台构建产品的组件。WiX 要求组件的不同平台各自拥有其独特的产品 GUID。挑战在于拥有一个单一的解决方案,该解决方案可以在多平台安装程序之前为多个平台构建组件,每个平台都有其自己独特的平台特定项目 GUID,而无需冗余的项目文件,这些文件可能会偏离源代码项目的开发。
基本方法
小的、单平台项目存根可用于通过使用 <Import />
元素来 *包含* 完整项目。
例如,MyProject-x86.csproj(如下所示,完整显示)将引用并包含包含完整项目详细信息的首要 MyProject.csproj。
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<AltProjectGUID>{6BA556BF-37D1-4BF0-81DC-AD68FB387CFE}</AltProjectGUID>
</PropertyGroup>
<Import Project="MyProject.csproj" />
</Project>
确保为每个平台存根项目使用唯一的、工具生成的 GUID。AltProjectGUID
是一个虚构的标签;可以使用任何不冲突的标签名称。在我的例子中,存根项目位于与它们包含的项目相同的目录中。如果不是这种情况,则必须使用导入项目的绝对或相对路径。
每个目标项目将在项目文件的顶部附近包含以下元素
<ProjectGuid>{9A01BD2F-DFFF-4E1B-9DF5-72EE4461ED2D}</ProjectGuid>
将此行更改为以下内容;并相应地修复 GUID
<AltProjectGUID Condition=" '$(AltProjectGUID)'==''
And '$(Platform)'=='x86'
">{B2CC2918-1188-4DD9-A16B-35E16FAAD372}</AltProjectGUID>
<AltProjectGUID Condition=" '$(AltProjectGUID)'==''
And '$(Platform)'=='x64'
">{2CBAD510-C714-4C58-A6E1-6AD5B963DADF}</AltProjectGUID>
<AltProjectGUID Condition=" '$(AltProjectGUID)'=='' ">
{9A01BD2F-DFFF-4E1B-9DF5-72EE4461ED2D}</AltProjectGUID>
<ProjectGuid>$(AltProjectGUID)</ProjectGuid>
最后一个 <AltProjectGUID>
元素是默认值,当项目未被存根项目包装,或者存根项目的平台与预期的平台不匹配时使用。确保此默认 GUID 与您的常规解决方案 (.sln) 文件匹配。如果它与解决方案文件不匹配,Visual Studio 会随意用新的 <ProjectGuid>
覆盖它。
最后,将您的存根项目添加到您的多平台解决方案,并强制您的解决方案的配置管理器将每个存根项目与所需的构建平台匹配。在我的例子中,我删除了所有不必要的平台选项,以强制执行一致的构建约束。
与上述项目文件一样,您需要在 Visual Studio 之外编辑解决方案 (.sln) 文件,以确保为每个存根项目使用正确的 GUID。以下是您在解决方案文件中要查找的内容的片段
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") =
"cwprint-x86", "..\cwprint-x86.csproj",
"{B2CC2918-1188-4DD9-A16B-35E16FAAD372}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") =
"cwprint-x64", "..\cwprint-x64.csproj",
"{2CBAD510-C714-4C58-A6E1-6AD5B963DADF}"
EndProject
{B2CC2918-1188-4DD9-A16B-35E16FAAD372}.Release|Any CPU.ActiveCfg = Release|x86
{B2CC2918-1188-4DD9-A16B-35E16FAAD372}.Release|Any CPU.Build.0 = Release|x86
{2CBAD510-C714-4C58-A6E1-6AD5B963DADF}.Release|Any CPU.ActiveCfg = Release|x64
{2CBAD510-C714-4C58-A6E1-6AD5B963DADF}.Release|Any CPU.Build.0 = Release|x64
条件和异常
为了使这种方法有效,每个基本项目必须为每个目标平台具有单独的输出路径。即使多平台解决方案将正确构建,它也会隐藏所有源代码文件,并将依赖引用显示为未解决。如果需要,构建顺序必须通过在解决方案中设置“项目依赖项”来手动构建。
结论
您将希望从它们的常规解决方案管理您的项目,但这个多平台技巧可以让您一次性构建针对多个平台的项目。
历史
- 初始提交