1

64 ビットの Windows 7 でNgenを使用して .NET 4.0 アプリケーションのネイティブ イメージを生成しようとしています。プラットフォームが x64 (または任意の CPU ) に設定されている場合、Ngen が失敗し、「Mscorlib.dll が原因で NGen を続行できない」と不平を言います。ネイティブ イメージ が あり ませ ん. '

x86 としてコンパイルし、適切な Ngen を使用すると、正常に動作します。また、.NET バージョンを 2.0 に変更すると動作します。(x86 Ngen で x64 アプリケーションを Ngen しようとすると、64 ビット バージョンを使用するように指示されます。)

詳細情報:

これは、CMD で見たもの (の一部) です。楕円 (= ...) はオリジナルに存在します。

1> アセンブリmscorlibのコンパイル、バージョン = 4.0.0.0、カルチャ = ニュートラル、PublicKeyToken = b77a5c561934e089 (CLR v4.0.30319) ...

1> mscorlib、バージョン = 4.0.0.0、カルチャ = ニュートラル、PublicKeyToken = b77a5c561934e089

.

2> アセンブリ アクセシビリティのコンパイル、バージョン = 4.0.0.0、カルチャ = ニュートラル、パブリック キートークン = b03f5f7f11d50a3a (CLR v4.0.30319) ...

.

2>Ngen は、イメージ アクセシビリティ、バージョン = 4.0.0.0、カルチャ = ニュートラル、PublicKeyToken = b03f5f7f11d50a3a のネイティブ コードを生成できませんでした。これは、次のエラーが原因です: Mscorlib.dll にネイティブ イメージがないため、NGen を続行できません(HRESULT からの例外: 0x80131F06) )

内部C:\Windows\assemblyを検索すると、3 つのmscorlib.dllが見つかりました。に1GAC_32つ、GAC_64(2.0.0.0 で始まるサブフォルダーに両方とも) に 1 つ、サブフォルダーに 1 つtemp

内部C:\Windows\Microsoft.NETを検索すると、そのうちの 6 つが見つかりました。「v4.0...」で始まるフォルダーassembly(と) の下に 2 つ、 GAC' s に 4 つ: Frameworkに 2 つ、Framework64に 2 つ(それぞれ - 「v2.0...」に 1 つ、「v4.0...」に 1 つ)。3264Framework

これは、.NET 2.0 mscorlib のみが実際にネイティブ イメージとして (必要な場合に) 実行されるということですか? Ngen が .NET 4.0 のネイティブ イメージの保存に成功しないのはなぜですか?

結論: x64 をターゲットとする .NET 4.0 アプリケーションのネイティブ イメージを作成するにはどうすればよいですか?

4

1 に答える 1

2

これは不健康です。mscorlib.dll の ngen-ed イメージは、.NET がマシンにインストールされたときに作成されているはずです。c:\windows\assembly\NativeImages_v4.0.30319_64\mscorlib\ab0a8fc3d086a3aaf942f366a12a9185\mscorlib.ni.dll にあります。ディレクトリ名のハッシュ部分が、あるマシンから別のマシンにどれだけ繰り返されるかはわかりません。

このファイルは Windows エクスプローラーでは表示できません。コマンド プロンプトを使用する必要があります。そこにあるかどうかを確認してください。見つからない場合は、.NET のインストール時に深刻な問題が発生しています。「.NETランタイム最適化サービス」はその仕事を成し遂げるものです。それを無効にしていないことを確認してください。

よくある間違いは、昇格されていないコマンド プロンプトから ngen.exe を実行することです。

于 2013-09-08T11:45:21.873 に答える