Assembly.LoadFile 在可执行文件的位置查找依赖项

5

我编写了一个包装类,使用反射加载其他程序集。Wrapper.dll也通过反射被一个进程加载,以下是图示来解释这种情况。

Process.exe  
         |___Loads__ Wrapper.dll  
                         |_______Loads___1.dll  
                                           |___ Depends___ xyz.dll  

以下是文件结构:
Root
  |___A  
  |   |__Process.exe  
  |___B  
      |__Wrapper.dll   
      |__C
         |__1.dll
         |__xyz.dll

我正在使用 Assembly.LoadFile(@"c:\root\B\C\1.dll"); 函数来加载 Wrapper.dll 中的 1.dll,但它无法找到依赖项,因为它试图在 A 目录中查找依赖项,而同一个目录是我们拥有进程可执行文件的位置。

1个回答

12
我找到了解决方案,只需将Assembly.LoadFile更改为Assembly.LoadFrom,就可以完美加载。你可以在这里阅读解释。然而,以下是其要点。

Load-From上下文

Load-From 上下文允许您从不在应用程序路径下的路径加载程序集,因此未包含在探测中。它使得依赖项能够从该路径定位和加载,因为路径信息由该上下文维护。此外,在此上下文中的程序集可以使用加载到默认加载上下文中的依赖项。


我得到了这个:托管调试助手“LoadFromContext”:“使用LoadFrom上下文从“file:///C:/xxx.dll”加载的名为“xxx”的程序集。使用此上下文可能会导致序列化、转换和依赖项解析出现意外行为。在几乎所有情况下,建议避免使用LoadFrom上下文。这可以通过将程序集安装在全局程序集缓存或ApplicationBase目录中,并在显式加载程序集时使用Assembly.Load来完成。” - Daniel Williams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接