以下是设置:
纯粹的DotNET类库由非托管桌面应用程序加载。类库充当插件。这个插件加载了自己的小插件(所有DotNET类库),并通过将dll作为字节流读入内存来实现,然后
Assembly asm = Assembly.Load(COFF_Image);
当那些小宝贝插件引用其他dll时会出现问题。由于它们是通过内存而不是直接从磁盘加载的,因此框架通常无法找到这些引用的程序集,因此无法加载它们。
我可以将AssemblyResolver处理程序添加到我的项目中,我可以看到这些引用的程序集已经过去了。我对在磁盘上找到这些引用程序集的位置有一个相当好的想法,但是如何确保Assmebly I加载是正确的?
简而言之,我如何可靠地从System.ResolveEventArgs.Name字段转到dll文件路径,假设我有一个这个dll可能隐藏的所有文件夹的列表?
答案 0 :(得分: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;
}
}
完整性:
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;
}
答案 1 :(得分:2)
Managed Extensibility Framework (MEF)听起来像解决你所有问题的东西。它可以扫描文件夹以查找DLL,解决任何深度的依赖关系并管理插件组合。每个部分(或“插件”)只需要声明它需要什么以及它提供什么,MEF负责布线。如果MEF成功地驯服VS2010的可扩展性野兽,那么它可以处理任何事情。
答案 2 :(得分:1)
我从来没有运过AssemblyResolver。我通常做这三个中的一个: