ReflectionOnly加载上下文的问题

时间:2012-01-29 15:57:25

标签: c# .net reflection

我正在尝试通过将某些DLL加载到ReflectionOnly上下文来加速我的应用程序。

此加载发生在辅助AppDomain上,该辅助AppDomain注册AssemblyResolve和AssemblyReflectionOnlyResolve事件处理程序。

出于某种原因,在加载这些程序集时,代码在此方法上失败:

Type[] tps = dll.GetTypes();

这引发了一个例外:

  

无法解析对程序集'System,Version = 2.0.0.0的依赖性,   Culture = neutral,PublicKeyToken = b77a5c561934e089'因为它没有   已预装。使用ReflectionOnly API时,依赖   组件必须通过预先加载或按需加载   ReflectionOnlyAssemblyResolve事件。

将程序集加载到Reflection Only上下文时,这可以按照假设进行。

使用“仅反射”上下文是否存在任何问题/警告?为什么运行时不能在GAC中找到此程序集并像往常一样加载它?我错过了什么吗?

1 个答案:

答案 0 :(得分:7)

从MSDN:“依赖关系不会自动加载到仅反射上下文中”。所以 在AppDomain.ReflectionOnlyResolve事件处理程序中,您必须通过Assembly.ReflectionOnlyLoad()加载'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。