【问题标题】:What are execution context and reflection-only context in .Net?.Net 中的执行上下文和仅反射上下文是什么?
【发布时间】:2019-07-15 12:34:30
【问题描述】:

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

关于执行上下文,我能够在 msdn 上找到 ExecutionContext 类的 the documentation,以及关于仅反射上下文,只有 how to load assemblies 进入其中。

谁能提供这两个概念的描述?

【问题讨论】:

  • An execution context is the managed equivalent of a COM apartment. The reflection-only load context allows you to examine assemblies compiled for other platforms or for other versions of the .NET Framework. Code loaded into this context can only be examined; it cannot be executed. This means that objects cannot be created, because constructors cannot be executed. 两者都是链接中的引用。 前者可以让你运行。后者可让您检查事物。
  • 您几乎已经回答了您的问题:) 仅反射上下文仅用于检查代码以用于反射目的,而不用于代码执行
  • @mjwills 那么这样的上下文是什么?它是每个线程的内存位置吗?它是进程之间共享的一些环境吗?感谢您试图向我提供一些信息,但我之所以问这个问题是因为我不明白这些是什么。
  • @mjwills 我不认为是这样,我正在尝试为这些上下文找到一个定义。我不是想解决任何问题,而是通过一些 msdn 文档找到自己的方法。
  • so what is a context like this? Is it a per thread memory location? Is it some environment shared between processes? 简短的回答是——我不相信它是按照实现细节的水平来记录的。因此,虽然我可以描述一个特定的实现是如何起作用的,但这对您没有多大帮助。因此,例如 - 目前不会在进程之间共享 - 但也许将来可能会。

标签: c# .net


【解决方案1】:

.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 进行标记。

它只加载类型元数据,因此您可以检查该程序集中的类型是什么样的。

【讨论】:

  • 好的,所以这些上下文实际上并不是一些环境,而是更像是加载对象的状态,对吗?
  • 它们告诉运行时加载的代码/程序集是否可以执行代码(除其他外)。例如,如果您只想检查类/属性/属性/资源而不调用函数来执行代码,则可以在“仅反射”上下文中加载。如果您不完全信任正在检查的组件,这也很有帮助。尽管据我了解,reflectionOnly 不是一项安全功能。
猜你喜欢
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
  • 2012-03-12
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
相关资源
最近更新 更多