2

このアプリケーションは、それぞれが独自のサブディレクトリにあるプライベート アセンブリのセットを動的に読み込みます。それらはそれぞれ、同じサブディレクトリにもある独自の依存関係を持っています。各アセンブリには厳密な名前が付けられ、依存関係は同じライブラリですが、バージョンが異なります。

MyApp
|-> Folder1\
|          |->PrivateAssembly1.dll
|          |->Dependency.dll                   Version 1.0.0.0
|
|-> Folder2\
|          |->PrivateAssembly2.dll
|          |->Dependency.dll                   Version 2.0.0.0
|
...

xcopy 展開を行っているため、GAC は使用しません。

また、プライベート アセンブリが見つからないという問題を解決するために をprobing privatePath定義しました。"Folder1;Folder2"

問題は、PrivateAssembly1.dll はその依存関係を見つけているように見えますが、PrivateAssembly2.dll は見つけていないことです。というか、Folder2 の代わりに Folder1 の Dependency.dll を使用しようとしているようです。

AssemblyResolve イベントを使用してこれらの問題を手動で解決できることはわかっていますが、これは最もクリーンな方法ではありません。私が見落としている他の解決策はありますか?

ありとあらゆるアイデアをありがとう。

アップデート:

Fusion Log ツールの出力:

LOG: DisplayName = Dependency, Version=1.0.0.0, Culture=neutral, PublicKeyToken=#########
 (Fully-specified)
LOG: Appbase = file:///C:/Workspaces/Shell/MyApp/bin/
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = NULL
...
LOG: Attempting download of new URL file:///C:/Workspaces/Shell/MyApp/bin/Dependency.DLL.
LOG: Attempting download of new URL file:///C:/Workspaces/Shell/MyApp/bin/Dependency/Dependency.DLL.
LOG: Attempting download of new URL file:///C:/Workspaces/Shell/MyApp/bin/Folder2/Dependency.DLL.
LOG: Assembly download was successful. Attempting setup of file: C:\Workspaces\Shell\MyApp\bin\Folder2\Dependency.dll
LOG: Entering run-from-source setup phase.
LOG: Assembly Name is: Dependency, Version=2.0.0.0, Culture=neutral, PublicKeyToken=#######
WRN: Comparing the assembly name resulted in the mismatch: Major Version
ERR: The assembly reference did not match the assembly definition found.
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.

したがって、基本的には、Folder2 で Dependency.dll を見つけ、バージョンが一致しないことを確認するためだけにそれをロードしようとします。次にFolder1を試すと思いますが、そこで止まります...

4

2 に答える 2

1

最初に行うことは、Fusion Log Viewer " FUSLOGVW.exe" 1を使用して、アセンブリの読み込みのログを有効にすることです。これにより、CLR が依存関係をどこから読み込もうとしているかがわかります。これにより、一部の場所が欠落していることが確認され、 で何が欠落しているかがわかります.config

[編集: ログ付き]

一致するアセンブリ名が見つかると、それ以上 (ファイル) 検索は行われません。つまり、アセンブリ名を一意に保ちます。

(これは C++ メソッドのオーバーロードの解決に似ています。最初に最適な一致が検出され、次にアクセシビリティがチェックされるため、アクセス可能な弱いパラメーターの一致は考慮されません。)

1注意。64 ビット システムで実行している場合、このツールには 32 ビット バージョンと 64 ビット バージョンがあります。正しいバージョンを使用してください。

于 2009-10-07T10:23:34.093 に答える
0

.NET がこれに反対する理由は、同じアセンブリの異なるバージョンを appdomain に読み込もうとしているからです。PrivateAssembly1.dll と PrivateAssembly2.dll で実際に同じライブラリ バージョンを使用できるかどうかを決定する必要があります。可能であれば、これによりかなりの手間が省けます。

Dependency.dll の両方のバージョンをロードするカスタム リゾルバーを追加することで、appdomain に強制的にロードすることは実際に可能ですが、これを行うとかなり狭いパスに入ることになることに注意してください。たとえば、両方のバージョンに異なるバージョンの静的変数が存在し、Folder1\Dependency.dll アセンブリで作成された型は Folder2\Dependency.dll アセンブリで認識されず、その逆も同様です。 「同じ」と思われるかもしれません。

于 2009-10-07T12:40:10.153 に答える