2

私はc#を使用してWindowsクライアントアプリケーションに取り組んでおり、VS 2010ソリューションにはスタートアッププロジェクトとサードパーティのCOM相互運用機能DLLを使用するクラスライブラリの2つのプロジェクトがあります。デスクトップは64ビットで、すべてのクライアントマシンは64ビットです。良い。

スタートアッププロジェクトを(ビルド設定)の任意のCPUとして保持し、COM DLLを呼び出す2番目のプロジェクトのx86を保持すると、次のエラーが発生します。

Could not load file or assembly ... or one of its dependencies. An attempt was made load a program with an incorrect format.

両方のプロジェクトをAnycpuとして保持すると、次のエラーが発生します。

Retrieving the COM class factory for component with CLSID .. failed due to the following error:

ソリューション(すべてのプロジェクト)をx86に変換せずに問題を解決する方法についてのアイデア。

4

3 に答える 3

3

DLL surrogatesを参照することをお勧めします。このトリックは間違いなく問題を解決しますが、レジストリ内の DLL inrpoc サーバーの登録情報を変更できる場合に限ります。クラスがサロゲートを使用するように構成されている場合、別のプロセスで実行されます。COM を使用すると、64 ビット アプリケーションからプロセス外の 32 ビット COM サーバーを使用できます。

変更する必要があるのは、以下のとおりです。

レジストリの次のエントリを見てください。

HKCR\CLSID\{CLSID_CoClass}

AppID フィールドがあるかどうかを確認します。存在する場合は、次のレジストリ キーにアクセスしてください。

HKLM\Software\Classes\AppID\{APPID}

値のない DllSurrogate 文字列キーを追加します。

クラスに関連付けられた AppID がない場合は、自分で作成できます。次に、64 ビットを対象とした .net アプリケーションから 32 ビットの inproc ライブラリを使用できます。

于 2012-04-04T20:16:12.637 に答える
1

おそらく最も簡単な方法は、メインの実行可能ファイルを x86 に設定することです。残りのアセンブリがどのようにジットされるかを決定するアプリケーションです。

于 2012-04-04T20:34:22.720 に答える
-1

上記のどれも私にとってはうまくいきませんでした。しかし、「参照の追加」をクリックすると、DLL を参照するのではなく、COM タブから関連する参照を選択することができます。これによりバージョン固有になるため、32 ビット バージョンを選択すると、ランタイムもそれに合わせて動作します。また、アプリケーション プールに関連する .NET フレームワーク バージョンを選択していることを確認し、[32 ビット アプリケーションを有効にする] を true (高度なアプリケーション プール設定) に設定することをお勧めします。

于 2014-04-17T13:56:27.207 に答える