.NET Framework 環境でネイティブ イメージ モジュールからジェネリック クラスのセキュリティ記述子を入手するときの "致命的な実行エンジンエラーが発生しました"


現象


Microsoft .NET Framework 環境でネイティブ イメージ (Ngen.exe) モジュールからジェネリック クラスのセキュリティ記述子を入手すると、"致命的な実行エンジン エラーが発生しました" のエラー メッセージが表示されます。この問題は、次の条件に該当する場合に発生することがあります。
  • アプリケーションに、ドメイン中立で読み込まれる (LoaderOptimization.MultiDomain または LoaderOptimization.MultiDomainHost) アセンブリが含まれている。
  • このアセンブリにジェネリック クラスをインスタンス化したものが含まれている。
  • ネイティブ イメージ ジェネレーター (Ngen.exe) のツールを使用して、このアセンブリがネイティブ イメージにコンパイルされている。
  • アプリケーションでネイティブ イメージがアプリケーション ドメインに読み込まれている。
  • アプリケーションが、ネイティブ イメージを第 2 のアプリケーション ドメインに読み込まずに、第 2 のアプリケーション ドメインからジェネリック クラスの使用を試みる。

原因


共通言語ランタイム (CLR) では、ネイティブ イメージが第 2 のアプリケーション ドメインに読み込まれていなくても、第 2 のアプリケーション ドメインでドメイン中立のネイティブ イメージ内のコードを実行できます。ネイティブ イメージが読み込まれる前に CLR でセキュリティ記述子を入手すると (インスタンス化されたジェネリック型のメソッドにデリゲートを作成する際など)、致命的な実行エンジン エラーが発生することがあります。

この問題が再現することは非常にまれです。CLR は集中的にアセンブリをアプリケーション ドメインに読み込みます。たとえば、Type オブジェクトがアプリケーション ドメインに渡されると、これによって CLR でタイプを定義するアセンブリが読み込まれます。そのため、CLR によるアセンブリの読み込みを行わずに、第 2 のアプリケーション ドメインでインスタンス化されたジェネリック クラスに関する情報を入手することが難しくなります。この問題の原因になっているコード パスは、複雑な状況でのみ発生します。

回避策


この問題を回避するには、次のいずれかの方法を使用します。
  • 使用される各アプリケーション ドメインにアセンブリを明示的に読み込みます。たとえば、Assembly.Load メソッドを呼び出してアセンブリを読み込みます。
  • アセンブリはドメイン中立として読み込まないでください。

    この回避策は、アプリケーションのワーキング セットのサイズに影響する場合があります。
  • Ngen.exe ツールを使用してアセンブリのネイティブ イメージを作成しないでください。

    この回避策は、アプリケーションのパフォーマンスに影響する場合があります。
  • アプリケーションを .NET Framework 4 にアップグレードしてください。この問題の原因となっている既知の問題は、すべて .NET Framework 4 で対処されています。

状況


マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。