1

アプリケーションを動的にロードするアプリケーション ローダーがあります。アプリケーションは、すべての依存関係が 1 つのフォルダーにあるアセンブリです。XCOPY デプロイメントを使用すると、フォルダーをコピー/削除することでアプリケーションを追加/削除できます。標準の .NET アセンブリ バインドを容易にするために、ローダーのビンの下にアプリケーション フォルダーをコピーします。構成ファイルにプローブの privatePath を設定すると、すべてが魅力的に機能します。

アプリケーションは、フレームワーク、つまり共有アセンブリを依存として使用します。

ここで、各アプリケーションが独自のバージョンのフレームワークを使用できる必要があるという要件があります。

フレームワークのバージョンを GAC にインストールすると、これは完全に機能し、さまざまなバージョンのアセンブリがデフォルトの AppDomain に正常に読み込まれます。

ここで、XCOPY ソリューションに戻り、対応するアプリケーション フォルダーに正しいフレームワーク バージョンをコピーすると、ソリューションが機能しなくなります。

そのフレームワークを参照する最初のアプリケーションは正常に動作しますが、2 番目のアプリケーションはアセンブリが見つからず、マニフェストが一致しないと不平を言います。

アセンブリと "privatePath" 内のフォルダーが最初に一致した後、.NET ローダーがプローブを停止し、それ以上検索しないように見えます。

GAC を使用する場合と同じ動作をさせる方法についてのアイデアはありますか? config、codeBaseで指定できるものは他にありますか? (絶対ファイル パスは使用しないでください)。

kr、ミシェル

4

2 に答える 2

0

アセンブリに関するこの記事によると:

また、CLR はプローブ中に事前に定義された一連のディレクトリを調べることにも注意してください。MyAssemblies の privatePath 値を指定すると、CLR は次の順序で MyLibrary という名前のアセンブリをプローブします。

C:/Apps/MyLibrary.DLL
C:/Apps/MyLibrary/MyLibrary.DLL
C:/Apps/MyAssemblies/MyLibrary.DLL
C:/Apps/MyAssemblies/MyLibrary/MyLibrary.DLL
C:/Apps/MyLibrary.EXE
C:/Apps/MyLibrary/MyLibrary.EXE
C:/Apps/MyAssemblies/MyLibrary.EXE
C:/Apps/MyAssemblies/MyLibrary/MyLibrary.EXE

CLR がアセンブリ ファイルをプローブするファイル パスの順序は重要です。これは、CLR が正しいファイル名を持つアセンブリ ファイルを見つけると、プローブ プロセスが停止するためです。1 つのバージョンの MyLibrary.dll を ApplicationBase ディレクトリに配置し、2 つ目のバージョンをサブディレクトリ MyAssemblies に配置してアプリケーションを配置した場合、CLR はどの DLL ファイルをロードしますか? CLR が ApplicationBase ディレクトリに DLL をロードしようとしていることがわかるはずです。これは、プローブ プロセス中に CLR によって常に最初に検索されるディレクトリだからです。

アップデート:

この投稿を確認してください。それはあなたが抱えている問題と多かれ少なかれ同じ問題を扱います。

于 2009-10-06T13:18:56.863 に答える
0

Assembly.LoadFrom を使用して、これらのフォルダーにあるすべてのアセンブリを読み込むと、さらにうまくいきます。

これにより、プローブ動作が変更され、ランタイムはアセンブリが最初に読み込まれた場所をローカルに検索して、その参照を見つけることができます。ただし、アセンブリ レベルでフレームワーク バージョンを共有できます。

あれは:

  • アプリ 'a' が読み込まれ、Framework v1.02 が読み込まれます。
  • アプリ 'b' が読み込まれ、Framework v1.01 が読み込まれます。
  • アプリ 'c' が読み込まれ、フレームワーク v1.02 にリンクされ、アプリ 'a' が読み込まれた後に読み込まれたコードを単純に再利用します。

つまり、アセンブリを明示的にロードしていない場合、このソリューションは役に立たない可能性があります。

その場合 - Yannick M. が言及した回答の解決策を使用します - AssemblyResolve イベントにフックします。アプリの読み込みを開始するときに静的な状態を保存して、どのアプリが読み込まれているかをイベント ハンドラーが認識できるようにします。解決できないアセンブリがある場合は、この状態を調べて、どこを見なければならないかを判断し、そこからアセンブリを読み込むことができます。

于 2010-01-13T23:21:53.643 に答える