2

我正在使用 VS2010 和 .NET 4.0。

我有两个小项目ABA是 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”的平台无效。平台='x86'。您可能会看到此消息,因为您正在尝试构建没有解决方案文件的项目,并且指定了该项目不存在的非默认平台。[一个.vcxproj]

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

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

4

3 回答 3

0

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

于 2013-09-03T01:39:19.673 回答
0

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

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

于 2013-09-03T08:42:48.747 回答
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>
于 2013-09-05T16:36:37.157 回答