繁体   English   中英

无法加载文件或程序集或其依赖项之一。 该系统找不到指定的文件。 (不允许GAC)

[英]Could not load file or assembly or one of its dependencies. The system cannot find the file specified. (No GAC allowed)

我有“主”程序,该程序使用反射动态加载了自己的“ plugin.dll”文件。 通过使用Visual Studio引用,“ plugin.dll”文件引用了第三方“ device.dll”。 只要“ device.dll”和“ plugin.dll”与“ Main”程序位于同一文件夹中,或者“ Main”程序引用“ plugin.dll”,一切正常。 但是,一旦我将“ device.dll”文件移动到另一个文件夹,就会收到以下错误消息:“无法加载文件或程序集或其依赖项之一。系统找不到指定的文件。” 发生问题的原因是程序找不到“ device.dll”文件。 “复制本地”属性或“引用路径”对此问题没有任何影响。 我知道我必须指定“ device.dll”的路径,但是如果不将“ plugin.dll”和“ device.dll”放入GAC(全局程序集缓存),我将找不到解决方法。 GAC并非解决方案,因为第三方dll也必须具有强名称(重复组装和重新组装),这是版权许可所不允许的。

其他详细信息:使用Visual Studio 2013和.Net Framework 4.0 FUSLOGVW不会注册任何错误(任何想法为什么?)。

期待您的建议,谢谢。

检查AppDomain.AssemblyResolve事件。 这是您执行自定义操作以将程序集加载到非默认位置的理想点。

我在这里添加链接的MSDN文章的引用:

此事件的ResolveEventHandler负责返回由ResolveEventArgs.Name属性指定的程序集,如果未识别该程序集,则返回null。 程序集必须加载到执行上下文中。 如果将它加载到仅反射上下文中,则导致引发此事件的加载失败。

最终,这意味着当无法使用默认程序集发现方法( AppDomain.BaseDirectory全局程序集缓存 ...)加载程序集时,您的应用程序或服务将进入AssemblyResolve事件案例。

引发所谓的事件后,您需要返回Assembly一个实例,这是您决定如何加载程序集的工作(从文件,流,字节...)。 也就是说,如果您将插件程序集放置在某个子目录中或知道位置,则可以使用正确的完整程序集路径调用Assembly.Load来加载它们,从而避免了程序集加载问题。

暂无
暂无

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

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