[英]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.