这是设置:
纯 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/