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 没有。或者更确切地说,它似乎试图使用 Folder1 中的 Dependency.dll 而不是 Folder2。

我知道这些问题可以通过使用 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 回答