1

我有一个“主”程序,它使用反射动态加载我自己的“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 框架 4.0 FUSLOGVW 不会记录任何错误(任何想法为什么?)。

期待您的建议,在此先感谢。

4

1 回答 1

4

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

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

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

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

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

于 2015-04-27T14:57:27.067 回答