解决装配,模糊的方式

Dav*_*ten 11 c# assemblies resolveassemblyreference

这是设置:

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

Assembly asm = Assembly.Load(COFF_Image);
Run Code Online (Sandbox Code Playgroud)

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

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

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

Sam*_*der 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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

完整性:

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;
    }
Run Code Online (Sandbox Code Playgroud)

  • 它只加载与我们试图解决的程序集同名的dll.当我完成它意味着它只加载我需要的1个dll,但是如果dll和程序集没有相同的名称,那么你必须加载每个dll并根据你要查找的名称检查程序集名称. (2认同)