我尝试使用AppDomain.AssemblyResolve
事件来处理运行时加载的某些dll程序集解析异常(动态加载类型的SerializationException)。
当该事件被触发时,我会加载目录中的所有DLL文件并创建一个Assembly
数组,然后使用以下方法获取包含指定类型的Assembly
:
public static Assembly GetAssemblyContainingType(String completeTypeName,
Assembly[] assemblies)
{
Assembly assembly = null;
foreach (Assembly currentassembly in assemblies)
{
Type t = currentassembly.GetType(completeTypeName, false, true);
if (t != null)
{
assembly = currentassembly;
break;
}
}
return assembly;
}
问题在于这段代码只能使用AssemblyQualifiedName
,而事件提供的ResolveEventArgs.Name
并不是很有用。
你能否提出一些解决方法?
在触发事件时,是否有办法传递其他参数?
Assembly.Load(assemblyName)
加载程序集并不会自动使其可用于应用程序域的程序集解析代码(除非该代码可以使用默认的解析过程访问该程序集)。此代码来自一个工作系统(我删除了错误处理代码,例如在additional.TryGetValue(e.Name, out res)
调用周围的代码,以简化代码)。当我移除ResolveAssembly
钩子时,我的工作系统就停止工作了 :) - Sergey Kalinichenko