C# 用模糊方法解决装配问题

C# 用模糊方法解决装配问题,c#,assemblies,resolveassemblyreference,C#,Assemblies,Resolveassemblyreference,以下是设置: 纯DotNET类库由非托管桌面应用程序加载。类库充当插件。这个插件加载自己的小插件(所有的DotNET类库),它通过将dll作为字节流读入内存来实现,然后 Assembly asm = Assembly.Load(COFF_Image); 当这些小插件引用其他DLL时,问题就出现了。因为它们是通过内存而不是直接从磁盘加载的,所以框架通常找不到这些引用的程序集,因此无法加载它们 我可以将AssemblyResolver处理程序添加到我的项目中,我可以看到这些引用的程序集被删除。关于

以下是设置:

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

Assembly asm = Assembly.Load(COFF_Image);
当这些小插件引用其他DLL时,问题就出现了。因为它们是通过内存而不是直接从磁盘加载的,所以框架通常找不到这些引用的程序集,因此无法加载它们

我可以将AssemblyResolver处理程序添加到我的项目中,我可以看到这些引用的程序集被删除。关于在磁盘上的何处找到这些引用的程序集,我有一个相当好的想法,但是如何确保加载的程序集是正确的


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

我从来没有使用过AssemblyResolver。我通常会做以下三项中的一项:

  • 要求插件没有GAC中没有的外部引用。如果他们发牢骚,告诉他们
  • 要求插件将其所有DLL转储到已知的插件目录中。将该目录中的所有程序集加载到内存中
  • 要求插件依赖项存在于fusion探测的路径中。您可以通过打开fusion日志(fuslogvw.exe——打开日志后别忘了重新启动!)来确定绑定器在哪里查找程序集

  • 当我在过去使用它时,我们只是将文件名与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;
        }
    

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

    Sam,这不是有点浪费吗,因为它肆意加载程序集,直到找到正确的程序集为止?它只加载与我们试图解析的程序集同名的DLL。当我这样做时,意味着它只加载我需要的1个dll,但是如果dll和程序集没有相同的名称,那么您必须加载每个dll,并根据您要查找的名称检查程序集名称。我想防止污染我的AppDomain的唯一方法是创建另一个AppDomain并首先加载它们?