繁体   English   中英

Assembly.LoadFrom和依赖项

[英]Assembly.LoadFrom and dependencies

我一直在尝试使用Assembly.LoadFrom()设置插件系统,该系统将dll动态加载到.exe目录的子文件夹中。

我有一个.exe和插件引用的接口库。 构建完成后,我将插件dll复制到子文件夹。

Differents插件可能具有相同的库,因此我想在.exe旁边收集那些依赖项。

我的理解是,我必须使用AssemblyResolve事件从exe目录中手动加载插件依赖项。 这个对吗 ? 因为似乎很麻烦。

在您的情况下,您有两种可能的情况:

1-您的Exe和您的插件共享一个参考:在这种情况下,Exe已经加载了共享的参考,您不必担心加载它。 即使您尝试再次加载它,因为它已存在于已加载的程序集中,也不会再次加载。

2-您的Exe不引用插件引用的库。 在这种情况下,如果库程序集存在于子文件夹中,并且您使用LoadFrom则它应尝试为您加载从属程序集。 现在,尽管您的应用程序启动路径是Exe的目录,但我不认为万一您从插件直接引用库时,程序集解析不会失败。 但是,如果由于任何原因而失败,.Net框架都可以通过AssemblyResolve来为您提供帮助。 您只需订阅该事件,然后使其在正确的路径(子文件夹)中搜索库。

这不是很麻烦。 它只是订阅一个事件。 像这样:

private static Assembly ResolveAssembly(object sender, ResolveEventArgs e)
{
    //The name would contain versioning and other information. Let's say you want to load by name.
    string dllName = e.Name.Split(new[] { ',' })[0] + ".dll";
    return Assembly.LoadFrom(Path.Combine([AssemblyDirectory], dllName));
}

您可以注册到AssemblyResolve事件,以防CLR无法加载依赖项时触发该事件,也可以在app.config使用<probing>元素来指​​示CLR也可以在这些目录中查找:

MSDN

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <probing privatePath="bin;bin2\subbin;bin3"/>
      </assemblyBinding>
   </runtime>
</configuration>

通过使用ProcMon.exe解决。 丢失的dll实际上已正确加载。 但是它也具有我没有复制到exe文件夹的依赖项。 DllNotFoundException的消息令人困惑,因为它没有报告丢失的dll,而是报告了失败的dll。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM