c# - 解析程序集,模糊方式

标签 c# assemblies resolveassemblyreference

这是设置:

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

Assembly asm = Assembly.Load(COFF_Image);

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

我可以将一个 AssemblyResolver 处理程序添加到我的项目中,我可以看到这些引用的程序集已删除。我很清楚在磁盘上的何处可以找到这些引用的程序集,但我如何才能确保我加载的 Assmebly 是正确的?

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

最佳答案

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

关于c# - 解析程序集,模糊方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2729446/

相关文章:

visual-studio - 在 Visual Studio 中找不到错误 "Metadata file ' ...\Release\project.dll'”

c# - 代码量是否会使数据结构变大?

c# - 使用字符和数字对 List<> 进行排序

c# - 标准化音频,如何将 float 组转换为字节数组?

c# - 如何在 Java 中使用 .Net 程序集

c# - Web.config 中的程序集

c# - 如何设置asp.net Identity cookies过期时间

c# - 如何协调我的许多 C# 项目树中的程序集版本信息?

.net - 什么是 ResolveAssemblyReference.cache?