【问题标题】:C# can't find assembly which is already loadedC# 找不到已加载的程序集
【发布时间】:2011-11-22 16:56:06
【问题描述】:

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

【问题讨论】:

  • 你能提供一个简短但完整的例子来说明这个问题吗?
  • 为什么不分享代码?解决问题会更容易。
  • 除了 Jon 建议的内容之外,您还应该提供您正在使用的 CLR 版本以及操作系统(32 位/64 位)。此外,您是否使用多个应用程序域并且您是否明确设置了LoaderOptimization 值?我们遇到了一些奇怪的问题。所有这些都在 32 位和 64 位上使用 CLR 2.0。
  • 我的操作系统是 64 位的,但我不知道如何学习 CLR 版本:(

标签: c# .net


【解决方案1】:

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

该问题的解决方案:

  1. 如果您必须加载该程序集的 2 个版本,请尝试通过实现 AssemblyResolve Event 来帮助运行时,示例也是 here
  2. 尝试使用AssemblyBindLogViewer 来确定插件的依赖关系并交叉检查您的问题。

如果您处理插件,我建议无论如何都实施该事件, 这样您就可以记录该 AppDomain 的所有组装请求。

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

希望我能帮上忙,请就您的解决方案给我们反馈!

配置插件文件夹

  1. 将插件加载到seperat AppDomain,其中插件文件夹为 ApplicationBase
    配置 AppDomains see这是加载插件的推荐解决方案,因为您可以定义 AppDomain(沙盒)的 security 级别
  2. 扩展您当前的AppDomains PrivatePath,因此它还会搜索此路径中的程序集。这种方法已经过时了!(但它确实有效)

【讨论】:

  • AssemblyResolve 是解决方案 - 问题是运行时对他的插件文件夹一无所知,因此在进行自己的依赖加载时忽略它。这适用于已经通过 LoadFrom 加载的 DLL - LoadFrom 通常可能是错误的。
  • 添加了另一种解决方案来定义插件文件夹。
  • AppendPrivatePath 帮助...谢谢。
  • 不客气,请将问题标记为已回答:-),谢谢!
【解决方案2】:

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

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);
    }
}

【讨论】:

    【解决方案3】:

    我也遇到过类似的问题,一般都是通过在项目属性中更改目标框架来解决的……

    【讨论】:

      猜你喜欢
      • 2021-03-02
      • 2011-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-07
      • 1970-01-01
      相关资源
      最近更新 更多