解决装配,模糊的方式

时间:2010-04-28 12:42:50

标签: c# assemblies resolveassemblyreference

以下是设置:

纯粹的DotNET类库由非托管桌面应用程序加载。类库充当插件。这个插件加载了自己的小插件(所有DotNET类库),并通过将dll作为字节流读入内存来实现,然后

Assembly asm = Assembly.Load(COFF_Image);

当那些小宝贝插件引用其他dll时会出现问题。由于它们是通过内存而不是直接从磁盘加载的,因此框架通常无法找到这些引用的程序集,因此无法加载它们。

我可以将AssemblyResolver处理程序添加到我的项目中,我可以看到这些引用的程序集已经过去了。我对在磁盘上找到这些引用程序集的位置有一个相当好的想法,但是如何确保Assmebly I加载是正确的?

简而言之,我如何可靠地从System.ResolveEventArgs.Name字段转到dll文件路径,假设我有一个这个dll可能隐藏的所有文件夹的列表?

3 个答案:

答案 0 :(得分:7)

当我过去使用它时,我们刚刚将文件名与具有名称的ResolveEventArgs.Name部分进行了比较。如果你想确定你正在加载完全相同的版本,我想你可以检查名称是否匹配,如果他们这样做,然后加载程序集,然后检查程序集全名对ResolveEventArgs.Name。

这些内容:

string name = GetAssemblyName (args); //gets just the name part of the assembly name
foreach (string searchDirectory in m_searchDirectories)
    {
    string assemblyPath = Path.Combine (executingAssemblyPath, searchDirectory);
    assemblyPath = Path.Combine (assemblyPath, name + ".dll");        
    if (File.Exists (assemblyPath))
        {            
        Assembly assembly = Assembly.LoadFrom (assemblyPath);
        if (assembly.FullName == args.Name)
            return assembly;
        }
    }

完整性:

private string GetAssemblyName (ResolveEventArgs args)
    {
    String name;
    if (args.Name.IndexOf (",") > -1)
        {
        name = args.Name.Substring (0, args.Name.IndexOf (","));
        }
    else
        {
        name = args.Name;
        }
    return name;
    }

答案 1 :(得分:2)

Managed Extensibility Framework (MEF)听起来像解决你所有问题的东西。它可以扫描文件夹以查找DLL,解决任何深度的依赖关系并管理插件组合。每个部分(或“插件”)只需要声明它需要什么以及它提供什么,MEF负责布线。如果MEF成功地驯服VS2010的可扩展性野兽,那么它可以处理任何事情。

答案 2 :(得分:1)

我从来没有运过AssemblyResolver。我通常做这三个中的一个:

  1. 要求插件没有GAC中没有的外部参考。如果他们讨厌,请告诉他们ILMerge
  2. 要求插件将所有dll转储到已知的插件目录中。将该目录中的所有程序集加载到内存中。
  3. 要求插件依赖项存在于由fusion探测的路径中。您可以找出绑定器查找程序集的位置打开融合日志(fuslogvw.exe - 打开日志后不要忘记重新启动!)。