3

私はこの問題を MSDN に投稿しましたが、MS サポートに連絡するのは少し時間の無駄です。彼らは 1 日 1 文しか手がかりなしに提供してくれます :( とにかく、ここに私の質問があります。コメントをいただければ幸いです。

相互運用プロジェクトでアセンブリの読み込みの問題が発生しています

つまり、3 つの VS プロジェクトがあります。

  • A は、静的バインディングを介して B を参照するネイティブ C プロジェクトです。つまり、A は必要に応じて B の関数を呼び出します。

  • B は CLI ラッパーで、C のオブジェクトを静的に参照します。

  • C は純粋な .NET コードである CS プロジェクトです。

B と C はどちらも厳密な名前で署名されており、 AssemblyInfo.csファイルとAssemblyInfo.cppファイルはキー ファイルで更新されます。

B と C の両方がgacutil.exe V4.0を使用して GAC に登録されています。A には、B.dll が登録されているフォルダーから B.dll への参照があり、B には、C が登録されているフォルダーと同じフォルダー内の C への参照があります。

A からプログラムを実行すると、次のメッセージで失敗します。

「コンピューターに B.dll が見つからないため、プログラムを開始できません。>この問題を解決するには、プログラムを再インストールしてください。

私がそれを機能させる唯一の方法は、B.dllをA.exeの同じフォルダーにコピーすることです。C.dll が GAC から読み込まれているようです。

パースペクティブをロードすると、混合アセンブリは異なる方法で機能しますか?

4

1 に答える 1

0

マネージコードを実行するためにCLRをロードするために、ちょっとしたハックを使用しています。おそらく、CLIコードで静的関数を記述し、それらを。で装飾しました__declspec(dllexport)。はい、それは機能します。ネイティブコード(A)は、C ++ / CLIコンパイラが生成したスタブを介して呼び出すことができます。これにより、CLRがロードされて初期化されます。

ただし、動作できないのは、GACでDLLを見つけるのに役立つCLRです。これは鶏が先か卵が先かという問題です。アセンブリを見つける前にCLRを読み込む必要があります。したがって、BがCを見つけることは問題ありません。しかし、Aの結果Bは機能しません。Bを見つけるのはネイティブのWindowsローダーの仕事であり、GACを調べる理由はまったくありません。

ネイティブプログラムと同じフォルダにBをデプロイする必要があります。

于 2012-11-13T18:16:41.490 に答える