7

アンマネージ DLL の周りに C# ラッパーを作成しています。アンマネージ DLL には、32 ビット バージョンと 64 ビット バージョンの両方があります。マネージド ラッパーを独自のプロジェクトに保持して、個別のコンポーネントとして構築し、ソリューション間で再利用できるようにします。

ただし、これはいくつかの問題を引き起こします。アンマネージド DLL は 32 ビット バージョンと 64 ビット バージョンの両方で同じ名前を持っているため、正しいアンマネージド DLL を出力 (bin) ディレクトリに移動するのに問題があります。ビルド構成が x86 の場合は 32 ビット バージョンをコピーし、x64 の場合は 64 ビット バージョンをコピーします。プロセッサ アーキテクチャが 1 つだけの場合、これは簡単に実現できます。アンマネージ DLL をプロジェクトにインクルードし、ファイルで copy local を true に設定するだけです。しかし、両方をターゲットにする必要があるため、よりトリッキーです。

このリンクは、同じソリューション/プロジェクトで Visual Studio を使用して 32 ビットと 64 ビットの両方をターゲットにしていますが、マシンに既に存在する DLL を参照しているようです。正しいバージョンの DLL を出力ディレクトリ (bin) にコピーする必要があります。

これを解決するためのヒントやテクニックは大歓迎です。

4

5 に答える 5

5

FreeImage ライブラリの .Net ラッパーで同じ問題が発生しました。マネージド ラッパーを参照するプロジェクト用に、x86 用と x64 用の 2 つのビルド構成を作成しました。次のように、プロジェクト ファイルの AfterBuild ターゲットに msbuild 条件付きコピー セクションを追加しました。

  <Target Name="AfterBuild">
    <Copy Condition="'$(Platform)' == 'X86'" SourceFiles="$(MSBuildProjectDirectory)\Resources\x86\FreeImage.dll" DestinationFolder="$(TargetDir)" />
    <Copy Condition="'$(Platform)' == 'X64'" SourceFiles="$(MSBuildProjectDirectory)\Resources\x64\FreeImage.dll" DestinationFolder="$(TargetDir)" />
  </Target>
于 2010-01-14T16:06:52.990 に答える
1

もう1つのオプションは、デバッグとリリースのほかにVisualStudioで新しい構成を作成することです。おそらくDebug32とDebug64などです。構成設定の1つはCPUアーキテクチャです。

次に、プロジェクトのビルド後のイベントで、プラットフォーム名マクロを条件として使用して、昔ながらのif/elseステートメントを実行できます...

または、アンマネージdllが格納されているソリューションのサブディレクトリとしてプラットフォーム名を使用した場合は、プラットフォーム名を使用してディレクトリからbinディレクトリにコピーできます。

于 2010-01-14T15:43:04.720 に答える
1

この場合、MSBuild などを使用してビルドを制御することを検討することをお勧めします。次に、32 ビットまたは 64 ビットのコンパイルを行うために使用するコンパイル フラグを設定できます。これを行うことで、プッシュする dll を制御することもできます。これはあなたの最良の選択肢のように聞こえます。msbuild が気に入らない場合は、nant も使用できます。

于 2010-01-14T15:23:12.917 に答える
1

私たちはプロジェクトで常にこれに対処しています。

32 ビット バージョンと 64 ビット バージョンのアンマネージ C++ DLL と、P/Invoke を使用してアンマネージ DLL を呼び出す C# プロジェクトがあります。

C++ DLL の場合、ターゲット パスは次のとおりです。

$(プラットフォーム名)\$(構成名)\$ターゲット名)

したがって、32 ビット リリース ビルドは Win32\Release に配置され、64 ビット デバッグ ビルドは x64\Debug に配置されます。

C# プロジェクトでは、「Any CPU」構成を削除し、新しい「x86」構成と「x64」構成に置き換えます。その出力ディレクトリは、.NET コンパイラが「x86」を使用するのに対し、C++ は「Win32」を使用して 32 ビット アーキテクチャの実行可能ファイルを示すことを除いて、アンマネージ C++ DLL に似ています。

C# プロジェクトのビルド後の手順では、適切なアンマネージ DLL を C# 実行可能ファイルのターゲット ディレクトリにコピーします。C# プロジェクトの各アーキテクチャと各構成には個別の出力ディレクトリがあるため、アンマネージ DLL のどのアーキテクチャがどの出力ディレクトリにあるかを明確に保つことに問題はありません。それらは常に一致します。

これをさらに簡素化するために、マルチファイル アセンブリ ( http://msdn.microsoft.com/en-us/library/226t7yxe.aspx ) の構築を調査して、アンマネージ DLL とその C# ラッパーの両方を単一の .xml に配置できるようにすることをお勧めします。 NET アセンブリに含まれているため、コピーする手間がまったく省けます。

于 2010-01-14T20:17:13.903 に答える
0

If you set your configuration to have two platforms, one for the 32 bit and 64 bit versions. Then you set the reference for each of the platforms to the correct dll version then all you need to do is set the copy local flag on your references properties and vsts will handle it all for you. No muss no fuss.

于 2010-01-14T15:55:42.903 に答える