5

x86 および x64 のフリーズ dll としてコンパイルされた混合モードの C++/CLI プロジェクトがあります。

「任意の CPU」としてコンパイルされたこのプロジェクトを使用する必要がある C# アプリがあります。c# アプリから正しい dll を正しく参照するにはどうすればよいですか? 参照の追加を右クリックすると、2 つの dll のうち 1 つだけを選択する必要があります。
私の「任意の CPU」C# アプリは、x64 プロセスとして実行されることもあれば、x86 プロセスとして実行されることもあります。

スマート構成ファイルを介してこれを行うことができると聞いたことがあります。

4

2 に答える 2

5

これに対処するにはいくつかの方法があります。最初の 1 つは最も単純です。アプリが実際にターゲット アーキテクチャに依存しているという事実を認めます。そして、その AnyCPU は適切な設定ではありません。x64 から取得した巨大な仮想アドレス メモリ空間が必要になることは非常にまれです。特に、x86 でも動作させる必要があるためです。EXE のプラットフォーム ターゲットを x86 に設定すれば完了です。

2 つ目は、これは単に展開の問題であるという結論です。アプリが 64 ビット オペレーティング システムにインストールされている場合は混合モード アセンブリの x64 ビルドをコピーし、32 ビット オペレーティング システムでは x86 ビルドをコピーするだけです。これを処理するセットアップ プロジェクトを作成する必要があります。最も簡単な方法は、それらを 2 つ作成することです。また、唯一の方法です。

3 つ目は、どちらの方法でも機能する場所についてベルが付いているもので、間違いなく質問しているものです。これには、コード、プロジェクト、およびインストーラーの変更が必要です。「x86」や「x64」などの名前の 2 つのサブディレクトリを作成するビルド後のイベントを作成する必要があります。そして、それぞれのバージョンの DLL をそれらにコピーします。これにより、CLR がこれらのアセンブリを見つけられなくなります。

コードでは、AppDomain.CurrentDomain.AssemblyResolve イベントのイベント ハンドラーを記述する必要があります。アセンブリの型を使用する前に、Main() メソッドでサブスクライブします。イベント ハンドラーは、Assembly.LoadFrom() を使用して、IntPtr.Size の値に基づいてサブディレクトリから正しいアセンブリを読み込む必要があります。64 ビット モードで実行する場合は 8 です。

さらに別のアプローチについて言及する必要がありますが、それは一般的に SO で眉をひそめています。両方のアセンブリを GAC にインストールします。すべてが自動です。

于 2011-03-04T16:32:04.277 に答える
2

C++ プロジェクトが 2 回コンパイルされたとしても、x86 DLL と x64 DLL の両方に対して同じマネージド インターフェイスを持つ必要があります。したがって、厳密な名前の署名を使用しない限り、参照する DLL のバージョンは問題になりません。重要なのは、正しいバージョンがターゲット マシンにデプロイされていることです。

于 2011-03-04T16:07:02.393 に答える