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

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

我有一个“主”程序,它使用反射动态加载我自己的“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 没有记录任何错误(知​​道为什么吗?)。

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

最佳答案

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

我在此处添加链接的 MSDN 文章的引用:

It is the responsibility of the ResolveEventHandler for this event to return the assembly that is specified by the ResolveEventArgs.Name property, or to return null if the assembly is not recognized. The assembly must be loaded into an execution context; if it is loaded into the reflection-only context, the load that caused this event to be raised fails.

归根结底,这意味着您的应用程序或服务将在无法使用默认程序集发现方法 (AppDomain. BaseDirectory全局程序集缓存...)。

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

关于c# - 无法加载文件或程序集或其依赖项之一。该系统找不到指定的文件。 (不允许 GAC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29899089/

相关文章:

c# - 关于C#中属性的两个问题

c# - 引发自定义事件以允许 Web 用户控件相互通信

c# - 线程 : Thread. CurrentThread.Name 和 Thread.CurrentThread.ManagedThereadId

.net - .NET 中 CultureInfo 的 CurrentCulture 和 CurrentUICulture 属性有什么区别?

java - 包含 native DLL 的 ANT Java-Jar 任务

C# .Net Dll 引用依赖

c# - 使用ZeroMQ通过Internet进行客户端/服务器通信

c# - 无法连接到 SQL Server 2014 Express

c# - 使用 HttpClient 区分超时和无服务器响应

delphi - 在 HostApp 和 DLL 之间预分配内存