次の方法で共有


.NET Framework 環境のネイティブ イメージ モジュールからジェネリック クラスのセキュリティ記述子を取得するときの致命的な実行エンジン エラー

この記事は、.NET Framework 環境のネイティブ イメージ モジュールからジェネリック クラスのセキュリティ記述子を取得するときに発生する 致命的な実行エンジン エラー を解決するのに役立ちます。

元の製品バージョン: Microsoft .NET Framework 3.5 Service Pack 1
元の KB 番号: 2468429

症状

Microsoft .NET Framework 環境のネイティブ イメージ (Ngen.exe) モジュールからジェネリック クラスのセキュリティ記述子を取得しようとすると、 致命的な実行エンジン エラー エラー メッセージが表示されます。 この問題は、次の条件に該当する場合に発生する可能性があります。

  • アプリケーションには、ドメインに依存しない (LoaderOptimization.MultiDomain または LoaderOptimization.MultiDomainHost) 読み込まれたアセンブリが含まれています。
  • アセンブリには、ジェネリック クラスのインスタンス化が含まれています。
  • アセンブリは、ネイティブ イメージ ジェネレーター (Ngen.exe) ツールを使用してネイティブ イメージにコンパイルされています。
  • アプリケーションは、ネイティブ イメージをアプリケーション ドメインに読み込みます。
  • アプリケーションは、ネイティブ イメージをそのアプリケーション ドメインに読み込まずに、2 番目のアプリケーション ドメインのジェネリック クラスを使用しようとします。

原因

共通言語ランタイム (CLR) では、ネイティブ イメージがまだそのアプリケーション ドメインに読み込まれていない場合でも、ドメインに依存しないネイティブ イメージ内のコードを 2 番目のアプリケーション ドメインで実行できます。 ネイティブ イメージが読み込まれる前 (インスタンス化されたジェネリック型のメソッドに対してデリゲートが作成された場合など) に CLR がセキュリティ記述子を取得しようとすると、致命的な実行エンジン エラーが発生する可能性があります。

この問題は再現が困難です。 CLR は、アセンブリをアプリケーション ドメインに積極的に読み込みます。 たとえば、 Type オブジェクトがアプリケーション ドメインに渡された場合、CLR は型を定義するアセンブリを読み込みます。 したがって、CLR がアセンブリを読み込むことなく、2 番目のアプリケーション ドメインがインスタンス化されたジェネリック クラスに関する情報を取得することは容易ではありません。 この問題の原因となるコード パスは、複雑なシナリオでのみ発生します。

対処方法

この問題を回避するには、次のいずれかの方法を使用します。

  • アセンブリを使用する各アプリケーション ドメインにアセンブリを明示的に読み込みます。 たとえば、 Assembly.Load メソッドを呼び出してアセンブリを読み込みます。

  • アセンブリをドメインに依存しないものとして読み込むことはありません。

    この回避策は、アプリケーションのワーキング セットのサイズに影響する可能性があります。

  • Ngen.exe ツールを使用してアセンブリのネイティブ イメージを作成しないでください。

    この回避策は、アプリケーションのパフォーマンスに影響する可能性があります。

  • アプリケーションを .NET Framework バージョン 4 にアップグレードします。 この問題の影響を受けることがわかっているすべての問題は、.NET Framework 4 で対処されています。