2

VS2010 と .NET 4.0 を使用しています。

私は 2 つの小さなプロジェクトABを持っています。Aは C++/CLI DLL プロジェクトで、BはAを参照する C# EXE プロジェクトです。Aは x86 ネイティブ dll を使用するため、どちらも x86 でコンパイルする必要があります。

VS2010 IDE でBをビルドすると、 Bはうまくコンパイルされます。次に、次のコマンド ラインを使用して MSBuild でBをビルドしようとします。

MSBuild B.csproj /property:プラットフォーム = x86;構成 = リリース

そして、次のエラーで失敗します。

" 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

このトピックに対する興味深いアプローチを見つけました: .csproj ファイルをカスタム XML で拡張して、依存する .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 に答える
0

両方のプロジェクトを含むソリューションがあり、適切にセットアップされている場合は、msbuild を使用してそのソリューションをビルドできるはずです (このソリューションでは、最初に Win32 を使用して A をビルドし、次に x86 を使用して B をビルドします)。

別のオプションは、B からプロジェクト A を参照する代わりに、参照 A の出力 dll を追加するだけです。これを機能させるには、まず A.dll が B.exe と同じディレクトリにあることを確認します。次に、出力ディレクトリを参照して A.dll を選択し、プロジェクト B への参照を追加します。また、'Copy Local' も必要ないので false に設定します。

于 2013-09-03T08:42:48.747 に答える