我有一个x86 Visual Studio解决方案,其中包含许多项目文件。一些DLL被设计为用作用户系统上其他应用程序的插件。我们正在扩展一些DLL,以便能够支持64位应用程序。我想要做的是设置解决方案/项目,以便只需点击“Build”就可以构建这些DLL的x86和x64版本。该解决方案包含C ++和C#项目。我意识到“批量构建”能够构建两者,但如果开发人员只需单击与之前相同的按钮并生成所有输出DLL,那么会更方便。
以下是我尝试过测试项目的一些修改,但还没有开始工作:
我已尝试修改<Target Name="AfterBuild">
以尝试:
<Target Name="AfterBuild" Condition=" '$(Platform)' == 'x86' ">
<PropertyGroup>
<Platform>x64</Platform>
<PlatformTarget>x64</PlatformTarget>
</PropertyGroup>
<CallTarget Targets="Build"/>
</Target>
但是会导致以下错误:
C:\Windows\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets(565,5): error MSB4006: There is a circular dependency in the target dependency graph involving target "Build".
我认为我的条件会阻止无限递归,但我理解MSBuild如何看不到它。
我也试过了:
<Project DefaultTargets="MyBuild86;MyBuild64" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
...
<Target Name="MyBuild86">
<PropertyGroup>
<Platform>x86</Platform>
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
<CallTarget Targets="Build"/>
</Target>
<Target Name="MyBuild64">
<PropertyGroup>
<Platform>x64</Platform>
<PlatformTarget>x64</PlatformTarget>
</PropertyGroup>
<CallTarget Targets="Build"/>
</Target>
但我的DefaultTargets
似乎在Visual Studio IDE中被忽略了。
最后,我尝试创建一个导入第一个项目的单独项目:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform>x64</Platform>
<PlatformTarget>x64</PlatformTarget>
<ProductVersion>9.0.30729</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<OutputPath>..\$(Configuration)\x64\</OutputPath>
<ProjectGuid>{A885CAC3-2BBE-4808-B470-5B8D482CFF0A}</ProjectGuid>
</PropertyGroup>
<Import Project="BuildTest.csproj" />
</Project>
到目前为止,这已经显示出最大的希望。但是,Visual Studio似乎忽略了此新项目中的OutputPath
设置,而是将exe / dll输出到原始项目中指定的路径。我可以看到没有PropertyGroup
块在原始项目中执行以覆盖它,所以我不确定发生了什么。
答案 0 :(得分:28)
我们做类似的事情来为.NET CF构建核心程序集。 试试这个:
<Target Name="AfterBuild">
<MSBuild Condition=" '$(Platform)' == 'x86' " Projects="$(MSBuildProjectFile)" Properties="Platform=x64;PlatFormTarget=x64" RunEachTargetSeparately="true" />
</Target>
答案 1 :(得分:6)
导入项目在Visual Studio 2010中对我有用:
TestProject64.vcxproj
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="TestProject.vcxproj" />
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{B7D61F1C-B413-4768-8BDB-31FD464AD053}</ProjectGuid>
</PropertyGroup>
</Project>
TestProject64.vcxproj.filters
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="TestProject.vcxproj.filters" />
</Project>
TestProject.vcxproj内部定义了两个配置:Release | x86和Release | x64。如您所见,TestProject64.vcxproj只有Release | x64配置。在TestProject64.vcxproj中定义至少一个配置是必要的,否则Visual Studio将无法将TestProject64.vcxproj添加到解决方案中。
现在可以将TestProject.vcxproj和TestProject64.vcxproj包含在同一个解决方案中,同时构建Release | x86和Release | x64。
答案 2 :(得分:4)
我认为最好的方法是从命令行调用msbuild。它不需要编辑msbuild文件,只需运行
msbuild myproj.sln /p:Configuration="Debug|Win32"
msbuild myproj.sln /p:Configuration="Debug|x64"
我假设如果开发人员正在使用Visual Studio,那么他们只会生成dll以便他们可以使用它们进行调试,并且如果您实际部署了dll,那么您有一个单独的构建过程?
答案 3 :(得分:4)
对于C ++,如果它是一个文件/设置不经常更改的项目,一种方法是在解决方案中创建两个项目,两个项目都引用相同的源文件。然后,在x64版本中,设置一个项目以构建64位,另一个32位。 (在x86版本中,将一个设置为32位并关闭另一个。)
我们已经使用了一段时间,它运行正常。
当然,您必须小心,您对其中所做的任何更改也会对其副本进行。即如果添加/删除文件或更改其构建设置,则必须在两个位置执行此操作。源代码更改仍然只需要执行一次,因为每个源文件仍然只有一个副本。
当然,您可能会认为这样做比使用IDE更加复杂/危险。在我们的例子中,它的效果非常好。
答案 4 :(得分:0)
您无法使用Visual Studio的UI执行此操作。为此,您需要破解MSBuild文件。
答案 5 :(得分:0)
也许我错过了讨论的重点。使用Visual Studio,转到Build / Configuration Manager。在Active Solution Platform下拉列表中,选择&#34; new ...&#34;,将出现一个New Solution Platform对话框。选择x64并接受默认的“复制自”。关闭对话框和配置管理器。现在打开Build / Batch Build。检查要构建的构建并构建它们。您将找到与Win32高管分开的x64构建可执行文件。您可以通过右键单击执行程序并选择“属性”来验证这些是否是预期的,然后选择“兼容性”选项卡。在下拉窗口中,您可以检查exec可以运行的操作系统。显然,您可能需要进行一些其他调整才能将所有输出文件放在适当的位置,但这种方法似乎比愚弄构建而不是上面描述的那些。
答案 6 :(得分:0)
我建议创建一个虚拟C ++ Makefile项目,然后从中调用两次MSBuild:
msbuild myproj.sln /p:Configuration="Debug|Win32"
msbuild myproj.sln /p:Configuration="Debug|x64"
答案 7 :(得分:-2)
我在VS2008 XP(32位)和VS2010 7(64位)中运行的项目遇到了这个问题。我使用的解决方案是使用$(PROGRAMFILES)变量。它在两台机器上都能正确解析。