0

MMCベースのアプリケーションのスナップインであるc++コードがいくつかあります。このスナップインは、COMラッパー(AssemblyA)を介して.net2.0dllを使用します。AssemblyAは、MMCセッションを起動するアプリと同じディレクトリにあります。AssemblyAは、他の.net dll(OtherAssemblies)を使用しますが、これは、私の制御が及ばない理由により、AssemblyAと同じディレクトリに存在することはできません。また、一部のコンポーネントを(AssemblyBから)動的にロードできるようにし、3番目のディレクトリでこれらを検索します。AssemblyBの動的コンポーネントは、AssemblyAの基本クラスを拡張するため、AssemblyAを参照します。

私の問題は、動的コンポーネントを読み込もうとすると、AssemblyAへの依存関係を解決できず、AssemblyResolveハンドラーが起動されることです(これは解決に使用していましたOtherAssemblies)。ハンドラーでクエリを実行Assembly.GetExecutingAssembly ()するとAssemblyResolve、アセンブリは解決しようとしているアセンブリです。

.NETランタイムが最初にロードされたアセンブリで依存関係を検索し、次にロードしているアセンブリのローカルで、次にappディレクトリで依存関係を検索することを期待していたので、この動作は少し奇妙に思えます。これらの最初と3番目には、ロードしようとしているアセンブリが含まれている必要があります。

AssemblyResolveメソッドを変更して、他の場所の依存関係を検索し、現在のアプリディレクトリのように機能するようにしましたが、手助けができれば、これは本当にやりたくありません。

この動作は予想されますか?それはMMCアプリであるためですか、それともC ++から呼び出されるCOMから起動されるためですか?私は劣等生ですか?

4

1 に答える 1

2

両方です。MMCを実行しているという事実により、.NETはアセンブリを解決するのが難しくなり、c:\ windows\system32には何も見つかりません。MMCの.configファイルを使用してこれを合理的に解決することはできません。これは、将来のプラグインに影響を与える可能性があります。

COMも役に立ちません。COMDLLを配置したディレクトリは、プローブパスにまったく影響しません。これを解決する1つの方法、AssemblyResolveはすでに見つかりました。または、すべてをGACに入れることもできます。

または、COMの使用を避け、Microsoft.ManagementConsole名前空間を使用してMMCプラグインを直接作成することもできます。

于 2010-02-05T13:30:50.413 に答える