1

我有一个动态加载应用程序的应用程序加载器。应用程序是一个程序集,其所有依赖项都位于一个文件夹中。使用 XCOPY 部署,我可以通过复制/删除文件夹来添加/删除应用程序。为了便于标准的 .NET 程序集绑定,我将应用程序文件夹复制到加载程序的 bin 下。我在配置文件中设置了探测 privatePath,一切都像一个魅力。

应用程序使用框架,即共享程序集作为依赖项。

现在我有一个要求,即每个应用程序都必须能够使用自己的框架版本。

当我在 GAC 中安装框架版本时,这完美地工作,并且程序集的不同版本被加载到默认的 AppDomain 中就好了。

现在我想回到我的 XCOPY 解决方案,并将正确的框架版本复制到其相应的应用程序文件夹中,然后解决方案就会中断。

第一个引用其框架的应用程序工作正常,第二个应用程序抱怨找不到程序集并且清单不匹配。

就好像 .NET 加载程序在第一次与“privatePath”中的文件夹匹配后停止探测并且不再查看。

关于如何具有与使用 GAC 时相同的行为的任何想法?还有什么我可以在配置代码库中指定的吗?(请不要绝对文件路径)。

克鲁,米歇尔

4

2 回答 2

0

如果您使用 Assembly.LoadFrom 加载您在这些文件夹中找到的所有程序集,您将会有更多的运气。

这会改变探测行为,并允许运行时在本地搜索到最初加载程序集的位置,以便找到它的引用。不过,您将在程序集级别获得框架版本共享。

那是:

  • 应用程序“a”加载,导致框架 v1.02 加载。
  • 应用程序“b”加载,导致框架 v1.01 加载。
  • App 'c' 加载,链接到 Framework v1.02,并简单地重用 App 'a' 加载后加载的代码。

也就是说 - 如果您没有显式加载程序集,此解决方案可能没有用。

在这种情况下 - 我会选择 Yannick M. 提到的答案中的解决方案 - 挂钩 AssemblyResolve 事件;在您开始加载应用程序时存储一些静态状态,以便您的事件处理程序知道正在加载哪个应用程序;如果任何程序集无法解析,您可以查看此状态以确定它应该查看的位置并从那里加载程序集。

于 2010-01-13T23:21:53.643 回答
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 找到具有正确文件名的程序集文件,探测过程就会停止。如果您在 ApplicationBase 目录中部署应用程序以及 MyLibrary.dll 的一个版本,在子目录 MyAssemblies 中部署第二个版本,CLR 将加载哪个 DLL 文件?您应该看到 CLR 将在 ApplicationBase 目录中加载 DLL,因为这始终是 CLR 在探测过程中搜索的第一个目录。

更新:

检查这篇文章。它或多或少地处理您遇到的相同问题。

于 2009-10-06T13:18:56.863 回答