我正试图通过将某些DLL加载到ReflectionOnly上下文中来加快我的应用程序。
此加载发生在辅助AppDomain上,该AppDomain同时注册AssemblyResolve和AssemblyReflectionOnlyResolve事件处理程序。
由于某种原因,当加载这些程序集时,代码在以下方法上失败:
Type[] tps = dll.GetTypes();
这抛出了一个异常:
无法解析对程序集"System,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089',因为它没有已预加载。使用ReflectionOnly API时,依赖程序集必须通过ReflectionOnlyAssemblyResolve事件。
当不将程序集加载到"仅反射"上下文中时,这将按假设工作。
使用"仅反射"上下文是否有任何问题/注意事项?为什么运行时不能在GAC中找到这个程序集并像往常一样加载它?我是不是错过了什么?
来自MSDN:"依赖项不会自动加载到仅反射上下文中"。所以在AppDomain.ReflectionOnlyResolve事件处理程序中,您必须通过Assembly.Reflection OnlyLoad()加载"System,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089"。您应该从ResolveEventArgs的name属性获取依赖的程序集名称作为
public static Assembly My_AssemblyResolve(object sender, ResolveEventArgs args)
{
string missedAssemblyFullName = args.Name;
Assembly assembly = Assembly.ReflectionOnlyLoad(missedAssemblyFullName);
return assembly
}
注意:ReflectionOnlyLoad()只加载GAC中的程序集。您可以使用ReflectionOnlyLoadFrom直接加载dll。