C# 用模糊方法解决装配问题
以下是设置: 纯DotNET类库由非托管桌面应用程序加载。类库充当插件。这个插件加载自己的小插件(所有的DotNET类库),它通过将dll作为字节流读入内存来实现,然后C# 用模糊方法解决装配问题,c#,assemblies,resolveassemblyreference,C#,Assemblies,Resolveassemblyreference,以下是设置: 纯DotNET类库由非托管桌面应用程序加载。类库充当插件。这个插件加载自己的小插件(所有的DotNET类库),它通过将dll作为字节流读入内存来实现,然后 Assembly asm = Assembly.Load(COFF_Image); 当这些小插件引用其他DLL时,问题就出现了。因为它们是通过内存而不是直接从磁盘加载的,所以框架通常找不到这些引用的程序集,因此无法加载它们 我可以将AssemblyResolver处理程序添加到我的项目中,我可以看到这些引用的程序集被删除。关于
Assembly asm = Assembly.Load(COFF_Image);
当这些小插件引用其他DLL时,问题就出现了。因为它们是通过内存而不是直接从磁盘加载的,所以框架通常找不到这些引用的程序集,因此无法加载它们
我可以将AssemblyResolver处理程序添加到我的项目中,我可以看到这些引用的程序集被删除。关于在磁盘上的何处找到这些引用的程序集,我有一个相当好的想法,但是如何确保加载的程序集是正确的
简言之,假设我有一个该dll可能隐藏的所有文件夹的列表,如何可靠地从System.ResolveEventArgs.Name字段转到dll文件路径?我从来没有使用过AssemblyResolver。我通常会做以下三项中的一项:
当我在过去使用它时,我们只是将文件名与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;
}
这听起来会解决你所有的问题。它可以扫描文件夹以定位DLL,解决任何深度的依赖关系,并管理插件组合。每个部件(或“插件”)只需声明它需要什么和提供什么,MEF负责布线。如果MEF成功地驯服了VS2010的可扩展性野兽,那么它可以处理任何事情。Sam,这不是有点浪费吗,因为它肆意加载程序集,直到找到正确的程序集为止?它只加载与我们试图解析的程序集同名的DLL。当我这样做时,意味着它只加载我需要的1个dll,但是如果dll和程序集没有相同的名称,那么您必须加载每个dll,并根据您要查找的名称检查程序集名称。我想防止污染我的AppDomain的唯一方法是创建另一个AppDomain并首先加载它们?