从.NET Framework环境中的本机映像模块获取泛型类的安全描述符时出现致命执行引擎错误

本文可帮助你解决从.NET Framework环境中的本机映像模块获取泛型类的安全描述符时发生的致命执行引擎错误

原始产品版本:Microsoft .NET Framework 3.5 Service Pack 1
原始 KB 编号: 2468429

症状

尝试从 Microsoft .NET Framework 环境中的本机映像 (Ngen.exe) 模块获取泛型类的安全描述符时,会收到“致命执行引擎错误”错误消息。 如果满足以下条件,则可能会出现此问题:

  • 该应用程序包括加载非特定域 (LoaderOptimization.MultiDomainLoaderOptimization.MultiDomainHost) 的程序集。
  • 程序集包含泛型类的实例化。
  • 程序集已使用本机映像生成器 (Ngen.exe) 工具编译为本机映像。
  • 应用程序将本机映像加载到应用程序域中。
  • 应用程序尝试使用第二个应用程序域中的泛型类,而无需将本机映像加载到该应用程序域中。

原因

公共语言运行时 (CLR) 可以允许非特定域的本机映像中的代码在二个应用程序域中运行,即使本机映像尚未加载到该应用程序域中。 例如,如果 CLR 尝试在加载本机映像之前获取安全描述符 (,例如,当为实例化泛型类型) 的方法创建委托时,可能会出现致命的执行引擎错误。

此问题难以重现。 CLR 主动将程序集加载到应用程序域中。 例如,如果将对象 Type 传递到应用程序域,则会导致 CLR 加载定义类型的程序集。 因此,第二个应用程序域不容易在不导致 CLR 加载程序集的情况下获取有关实例化泛型类的信息。 导致此问题的代码路径仅在复杂方案中出现。

解决办法

若要解决此问题,请使用以下方法之一:

  • 将程序集显式加载到将使用该程序集的每个应用程序域中。 例如,通过调用 Assembly.Load 方法加载程序集。

  • 不要以非特定域的形式加载程序集。

    注意

    此解决方法可能会影响应用程序的工作集的大小。

  • 不要使用 Ngen.exe 工具为程序集创建本机映像。

    注意

    此解决方法可能会影响应用程序的性能。

  • 将应用程序升级到版本 4 .NET Framework。 .NET Framework 4 中已解决已知导致此问题的所有问题。