4

我正在尝试通过反射动态加载程序集。我有这样的文件夹结构:

project
  \-- BIN
       |-- myApp.exe
       |-- SOMEEXTENTION1
       |    |-- someExtention1.dll
       |    \-- itsDependency1.dll
       |         
       |-- SOMEEXTENTION2
            |-- someExtention2.dll
            \-- itsDependency2.dll

我可以使用反射加载someExtention 。在执行过程中出现问题someExtention寻找itsDependency。点网在 BIN 文件夹中查找。它在那里找不到。引发 Appdomain 的 AssemblyResolve 事件...

我正在捕捉这个事件。在 ResolveEventArgs 我得到需要加载的程序集的名称。问题是我没有得到RequestingAssembly。ResolveEventArgs 的该属性始终为空。我需要请求程序集,以便我可以直接查看它自己的 EXTN 文件夹。否则,我必须查看所有 EXTN 文件夹,在我的情况下,这些文件夹可能非常大。

RequestingAssembly 有一个属性 Location,根据这篇 msdn 文章,它包含物理文件的路径。本文还介绍了此属性可能为 Nothing 的情况。我不明白那里讨论的加载上下文。

任何帮助将是可观的......

4

1 回答 1

4

根据我在实验中发现的结果(再次没有支持的搜索结果),动态加载程序集时,文件夹名称不能与程序集名称匹配。我不知道到底会发生什么,但是加载器机制内部的某些东西出了问题。

顺便说一句,当使用 LoadFrom 方法加载程序集时,它会在 load-from-context 中加载。在这种情况下,依赖程序集通过首先查看应用程序库然后查看程序集自己的文件夹来解决。就我而言,这解决了解决依赖关系的问题。

不利的一面是,我发现如果加载源无法解决依赖关系并且触发了 AssemblyResolve 事件,则请求程序集将不可用。这意味着无法确定请求程序集的路径。

而不是使用加载源,当我使用 LoadFile 方法时,依赖项不会自动从子文件夹中解析。而是触发了 AssemblyResolve 事件。在这种情况下,尽管 ResolveEventArgs 将包含请求程序集属性。用户代码可以从中轻松确定目标路径。然后用户代码可以加载依赖项。

于 2012-04-20T11:05:16.400 回答