繁体   English   中英

C#找不到已加载的程序集

[英]C# can't find assembly which is already loaded

我正在编写一个使用插件的应用程序。 插件是位于插件目录中的类库。 我的应用程序通过LoadFrom加载这些库。 其中一些具有库的形式的依赖关系,它们位于相同的插件目录中。 当我尝试通过Activator.CreateInstance从其中一个插件创建类的实例时,我收到一个异常'无法找到程序集'(这是插件的依赖程序集),但是这个程序集已经加载(!)和插件,它是在ProcessExplorer中可见。 我无法理解我的麻烦。

您的问题可能是,de加载的程序集与请求程序集的版本不同 .Net运行时将程序集在它们的名称之后和它们的版本之后映射,如果名称等于,并且版本差异,如果加载了另一个,则会得到异常,即“无法找到程序集”或类似的东西。 问题是,组件无法正确匹配。 但有一个解决方案:
请查看MSDN以获取有关该问题的更多信息。

该问题的解决方案:

  1. 如果必须加载组件的2个版本试图通过实施帮助运行时AssemblyResolve事件的样品也是在这里
  2. 尝试使用AssemblyBindLogViewer来确定插件的依赖关系并交叉检查您的问题。

如果您处理插件,我建议无论如何都要实现该事件,以便您可以记录该AppDomain的所有程序集请求。

您将在此处找到有关运行时行为和程序集加载的更多信息

希望我能提供帮助,请向我们提供有关您解决方案的反馈!

配置插件文件夹

  1. 将插件加载到一个单独的AppDomain中该插件具有作为ApplicationBase的pluginfolder
    要配置AppDomains, 请参阅 这是加载插件的recomendet解决方案 ,因为您可以定义AppDomain的安全级别(沙盒)
  2. 扩展当前的AppDomains PrivatePath ,因此它还会搜索此路径中的程序集。 这个方法已经过时了!(但这是它的工作)

您应该提供程序集文件的完整路径。

class Program
{
    static void Main(string[] args)
    {
        var asmFileName = "test.dll"; // Your plug-in file name
        var asmPath = AppDomain.CurrentDomain.BaseDirectory; // Your assemblies's root folder
        var asmFullPath = System.IO.Path.Combine(asmPath, asmFileName);
        var asm = System.Reflection.Assembly.LoadFrom(asmFullPath);
    }
}

我有类似的问题,他们通常通过改变项目属性中的目标框架来解决...

暂无
暂无

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

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