在编译引用x86中的C ++ / CLI DLL的C#项目时,MSBuild无法构建

时间:2013-09-03 00:56:36

标签: c# c++ visual-studio-2010 msbuild

我正在使用VS2010和.NET 4.0。

我有两个小项目 A B A 是C ++ / CLI DLL项目, B 是引用 A 的C#EXE项目。两者都必须在x86中编译,因为 A 使用x86本机dll。

当我使用VS2010 IDE构建 B 时, B 编译得很好。接下来,我尝试使用MSBuild使用以下命令行构建 B

  

MSBuild B.csproj / property:Platform = x86; Configuration = Release

它失败并出现以下错误。

  

A .vcxproj”(默认目标)(16) - > (InvalidPlatformError目标) - >   C:\ Program Files(x86)\ MSBuild \ Microsoft.Cpp \ v4.0 \ Microsoft.Cpp.InvalidPlatform.Targets(23,7):   错误MSB8007:项目“ A .vcxproj”的平台无效。平台=“86”。   您可能会看到此消息,因为您正在尝试构建没有的项目   解决方案文件,并指定了此项目不存在的非默认平台。 [ A .vcxproj]

似乎是因为C ++ / CLI使用“Win32”作为平台名称,而C#使用“x86”。因此,当我指定“x86”时,它无法构建 A 。如果是“Win32”,则无法构建 B

由于自动构建,我必须使用MSBuild。 B 的默认平台固定为AnyCPU(我无法更改),因此我无法使用默认平台技巧,并且在使用MSBuild构建时必须指定“x86”。我怎样才能做到这一点?有没有办法改变平台名称,或者更好的方式来使用MSBuild?我可以不使用默认平台吗?

3 个答案:

答案 0 :(得分:0)

对于这个,除了删除依赖 A 在本机x86 dll上的依赖性之外,我无法看到任何解决方法,将其替换为可以与其连接并编译为“AnyCPU”的东西(不确定你受到什么dll / s的限制。基本上我的理解是,win32意味着它可以运行在比x86编译程序更多的处理器上,因此它们与MSbuild的观点不兼容。如果为平台指定“AnyCPU”会发生什么?

答案 1 :(得分:0)

如果您有一个包含两个项目并正确设置的解决方案,您应该能够使用msbuild构建该解决方案(afaik解决方案将首先使用Win32构建A,然后使用x86构建B)。

另一种选择是不是从B引用项目A,而应该只添加引用A的输出dll。要实现这一点,首先要确保A.dll与B.exe位于同一目录中。然后通过浏览到输出目录并选择A.d​​ll来添加对项目B的引用。同时将'Copy Local'设置为false,因为那时不需要。

答案 2 :(得分:0)

刚刚找到了一个有趣的方法:使用一些自定义XML扩展.csproj文件,以便正确构建依赖的.vcxproj。

http://troyparsons.com/blog/2012/08/fixing-csproj-builds-that-reference-vcxproj-files-using-assignprojectconfiguration-task/#comment-843

以防链接失效,这是重要的部分。不知道为什么或如何运作,但它为我做了工作!

<Target Name="PrepProjectConfiguration" BeforeTargets="PrepareForBuild" Condition="'$(Platform)' == 'x86'">
   <AssignProjectConfiguration
         CurrentProjectConfiguration="$(Configuration)"
         CurrentProjectPlatform="$(Platform)"
         ProjectReferences="@(ProjectReference)"
         ResolveConfigurationPlatformUsingMappings="true">
      <Output TaskParameter="AssignedProjects" ItemName="ProjectReferenceWithConfiguration" />
   </AssignProjectConfiguration>
   <ItemGroup>
      <ProjectReference Remove="@(ProjectReferenceWithConfiguration)" />
   </ItemGroup>
   <Message Text="  regular reference %(ProjectReference.Identity)" />
   <Message Text="re-mapped reference %(ProjectReferenceWithConfiguration.Identity) - %(ProjectReferenceWithConfiguration.Configuration)|%(ProjectReferenceWithConfiguration.Platform)" />
</Target>