我很难理解.Net中的执行上下文和仅反射上下文的概念。据我了解,这是加载程序集的两种不同方式,但是我不能明确定义它们。
关于执行上下文,我能够在msdn上找到ExecutionContext
类的the documentation,而在仅反射上下文中,只能找到how to load assemblies。
有人可以提供这两个概念的描述吗?
答案 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进行标记。
它仅加载类型元数据,因此您可以检查程序集中的类型。