使用单个Visual Studio解决方案同时构建x86和x64?

Pet*_*asi 33 msbuild 64-bit visual-studio-2008 visual-studio

我有一个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>
Run Code Online (Sandbox Code Playgroud)

但这会导致以下错误:

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>
Run Code Online (Sandbox Code Playgroud)

但我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>
Run Code Online (Sandbox Code Playgroud)

到目前为止,这已经显示出最大的希望.但是,Visual Studio似乎忽略了我OutputPath在这个新项目中的设置,而是将exe/dll输出到原始项目中指定的路径.PropertyGroup我可以看到在原始项目中执行的任何阻止都不会覆盖它,所以我不确定发生了什么.

Tod*_*odd 29

我们做类似的事情来为.NET CF构建核心程序集.试试这个:

<Target Name="AfterBuild">
    <MSBuild Condition=" '$(Platform)' == 'x86' " Projects="$(MSBuildProjectFile)" Properties="Platform=x64;PlatFormTarget=x64" RunEachTargetSeparately="true" />
</Target>
Run Code Online (Sandbox Code Playgroud)

  • 适用于C++项目.刚从'x86'到'Win32'的状态改变了目标平台 (2认同)

小智 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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

TestProject.vcxproj内部定义了两个配置:Release | x86和Release | x64.如您所见,TestProject64.vcxproj只有Release | x64配置.在TestProject64.vcxproj中定义至少一个配置是必要的,否则Visual Studio将无法将TestProject64.vcxproj添加到解决方案中.

现在可以将TestProject.vcxproj和TestProject64.vcxproj包含在同一个解决方案中,同时构建Release | x86和Release | x64.


the*_*ill 5

我认为最好的方法是从命令行调用 MSBuild。它不需要编辑 MSBuild 文件。赶紧跑

msbuild myproj.sln /p:Configuration="Debug|Win32"
msbuild myproj.sln /p:Configuration="Debug|x64"
Run Code Online (Sandbox Code Playgroud)

我假设如果开发人员使用 Visual Studio,那么他们只会生成 DLL 文件,以便他们可以使用它们进行调试,并且如果您实际部署 DLL 文件,则您有一个单独的构建过程。