5

私は、.NET アプリケーション、特に混合アプリケーションを作成するのが初めてです。

最近、(管理されていない) C++ (MS Visual Studio 2010 の下) で、32 ビットと 64 ビットの両方のコンパイルをサポートするクライアント用の (静的) ライブラリ セットを作成しました。 . (内部的に、この機能は、OpenGL、boost、glm などの他のさまざまなサードパーティ ライブラリを使用しています)

今、彼は、C# アプリケーションでカスタム コントロールとして提供した機能の一部も使用できるようにしたいと考えています。

そこで、C++/CLI を使用して CLR をサポートする dll を作成し、C++/CLI を使用して機能のラッパー クラスを作成し、パブリックな (したがって外部からアクセスできる) カスタム WPF コントロールを作成しました。 32 および 64 ビット。

次に、テストのために、32 ビットまたは 64 ビットでビルドでき、DLL からコントロールを正常にロードできる単純な C# アプリケーションを作成しました (C# は初めてなので、これは非常に単純です)。そして、期待されていることを実行します。

私が今抱えている問題は、単一の実行可能ファイルを「任意の CPU」としてのみ配布できるようにしたいということです。これは、起動された場所に応じて適切なコード (つまり、32 ビットまたは 64 ビット) をロードする必要があります。

そこで、C# テスト プロジェクトに「任意の CPU」構成を追加し、「ビルド」タブの「プラットフォーム ターゲット」を「任意の CPU」に設定しました。しかし、現在、構成マネージャーの下で、他のプロジェクト (つまり、C++/CLI 混合モード dll によって消費される C++ 静的ライブラリ) に設定するプラットフォームがわかりません。したがって、テストのために x64 のままにしましたが、ビルドすると次の警告が表示されます。

Warning MSB3270: There was a mismatch between the processor architecture of the project being built "MSIL" and the processor architecture of the reference "(name of my 64 bit dll)", "AMD64".  <br /> 
This mismatch may cause runtime failures. Please consider changing the targeted processor architecture of your project through the Configuration Manager so as to align the processor architectures between your project and references, or take a dependency on references with a processor architecture that matches the targeted processor architecture of your project.

ただし、その警告が表示されても問題なく動作します。他のプロジェクトを「Win32」に設定すると同じ警告が表示され、代わりに「x86」に言及するだけですが、その場合、起動時に「PresentationCore.dll で「System.BadImageFormatException」タイプの未処理の例外が発生したという例外がスローされます。 "

それで、私はそれを何に変更する必要がありますか?実行可能ファイルをロードしてから、ロードする dll を決定するにはどうすればよいですか? どのように進めて、要求された方法で動作させるのか本当にわかりません。

4

1 に答える 1

2

Perforce ライブラリの使用に関する記事で、この問題の解決策を見つけました。

http://scottbilas.com/blog/automatically-choose-32-or-64-bit-mixed-mode-dlls/

基本的に、出力ターゲットであり、ホスティング C# (私の場合は WPF) アプリケーションの参照として使用されるプロキシ dll を作成する必要があります。

次に、実行可能ファイルと一緒に提供する dll の x64 および x86 バージョンを作成します。実行可能ファイルと一緒にプロキシ dll が存在しないことを確認する必要があります。

起動時に、プロキシ dll が見つからない場合に起動される AppDomain.CurrentDomain.AssemblyResolve のイベント ハンドラーを作成します。

次に、32 ビット環境か 64 ビット環境かに基づいて、正しい dll を選択してロードできます。

于 2014-03-07T09:36:03.143 に答える