.Net中的执行上下文和仅反射上下文是什么?

时间:2019-07-15 12:34:30

标签: c# .net

我很难理解.Net中的执行上下文仅反射上下文的概念。据我了解,这是加载程序集的两种不同方式,但是我不能明确定义它们。

关于执行上下文,我能够在msdn上找到ExecutionContext类的the documentation,而在仅反射上下文中,只能找到how to load assemblies

有人可以提供这两个概念的描述吗?

1 个答案:

答案 0 :(得分:4)

.NET程序集包含许多内容。通常,它们包含类型(类等)和元数据(有关这些类型的信息,等等)。

您使用反射访问元数据。

如果您只对元数据感兴趣,而不对实际使用程序集中的类型感兴趣,则可以在仅反射的上下文中加载该程序集。这样,您就可以加载和检查程序集元数据,但实际上不能实例化该程序集的类型。

CLR via C# by Jeffrey Richter是这方面的一个很好的资源。有关一些简短信息,请参见MSDN Blogs: Reflection Only Assembly Loading

this framework documentation: Assemblies in the Common Language Runtime -> Assembly Contents也很不错:

  

通常,静态程序集可以包含四个元素:

     
      
  • 程序集清单,其中包含程序集元数据。

  •   
  • 类型元数据。

  •   
  • 实现类型的Microsoft中间语言(MSIL)代码。

  •   
  • 一组资源。

  •   

还有How to: Load Assemblies into the Reflection-Only Context

  

仅反射加载上下文允许您检查为其他平台或.NET Framework其他版本编译的程序集。加载到此上下文中的代码只能进行检查;它无法执行。这意味着无法创建对象,因为无法执行构造函数。由于无法执行代码,因此不会自动加载依赖项。如果需要检查它们,则必须自己加载它们。

因此,仅反射上下文实际上不是不同的过程,不同的线程或其他任何东西,而只是加载程序集而不在其中加载代码或依赖项的一种方式。表示已加载程序集的Assembly类实例将使用其Assembly.ReflectionOnly property进行标记。

它仅加载类型元数据,因此您可以检查程序集中的类型。