我正在使用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?我可以不使用默认平台吗?
答案 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.dll来添加对项目B的引用。同时将'Copy Local'设置为false,因为那时不需要。
答案 2 :(得分:0)
刚刚找到了一个有趣的方法:使用一些自定义XML扩展.csproj文件,以便正确构建依赖的.vcxproj。
以防链接失效,这是重要的部分。不知道为什么或如何运作,但它为我做了工作!
<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>