ResolveEventArgs.RequestingAssembly 为 Null

inq*_*ive 5 .net reflection assemblies assemblyresolve

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

project
  \-- BIN
       |-- myApp.exe
       |-- SOMEEXTENTION1
       |    |-- someExtention1.dll
       |    \-- itsDependency1.dll
       |         
       |-- SOMEEXTENTION2
            |-- someExtention2.dll
            \-- itsDependency2.dll
Run Code Online (Sandbox Code Playgroud)

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

我正在捕获这个事件。在 ResolveEventArgs 中,我获取需要加载的程序集的名称。问题是我没有得到 RequestingAssembly。ResolveEventArgs 的该属性始终为空。我需要请求程序集,以便我可以直接查看其自己的 EXTN 文件夹。如果没有它,我必须查看所有 EXTN 文件夹,就我而言,这些文件夹可能非常大。

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

任何帮助将不胜感激...

inq*_*ive 5

根据我通过实验发现的情况(同样没有支持搜索结果),动态加载程序集时,文件夹名称必须与程序集名称不匹配。我不知道接下来会发生什么,但加载机制内部的某些东西出了问题。

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

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

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