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

时间:2015-04-27 14:53:36

标签: c# .net dll assembly-references assembly-reference-path

我有“Main”程序,它使用反射动态加载我自己的“plugin.dll”文件。 “plugin.dll”文件通过使用visual studio引用引用第三方“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没有注册任何错误(任何想法为什么?)。

期待您的建议, 提前谢谢。

1 个答案:

答案 0 :(得分:4)

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

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

  

此事件的ResolveEventHandler负责   返回ResolveEventArgs.Name指定的程序集   property,如果无法识别程序集,则返回null。该   必须将程序集加载到执行上下文中;如果它被加载   进入仅反射上下文,导致此事件的负载   提出失败。

在一天结束时,这意味着当使用默认程序集发现方法(41,42无法加载程序集时,您的应用程序或服务将进入AssemblyResolve事件情况, 全局程序集缓存 ...)。

引发所谓的事件后,您需要返回AppDomain.BaseDirectory的实例,并决定如何加载程序集(来自文件,流) ,bytes ...)。也就是说,如果您将插件程序集放在某个子目录中或者知道在哪里,您可以使用正确的完整程序集路径调用Assembly来加载它们并避免程序集加载问题。