.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 は型を定義するアセンブリを読み込みます。 そのため、2 番目のアプリケーション ドメインでは、CLR がアセンブリを読み込むことなく、インスタンス化されたジェネリック クラスに関する情報を取得することは容易ではありません。 この問題に影響を与えるコード パスは、複雑なシナリオでのみ発生します。

回避策

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

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

  • アセンブリをドメインニュートラルとして読み込まない。

    注:

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

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

    注:

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

  • アプリケーションを .NET Framework バージョン 4 にアップグレードします。 この問題に貢献することが知られているすべての問題は、.NET Framework 4 で対処されています。