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可能隐藏的所有文件夹的列表?
当我在过去使用它时,我们刚刚将文件名与具有名称的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)
| 归档时间: |
|
| 查看次数: |
1998 次 |
| 最近记录: |