31

タイトルがすべてを物語っています。Ngen.exe では実現できなかった .NET Native の機能について誰かが説明してくれることを期待していました。

4

2 に答える 2

30

.NET Native は、デスクトップ CLR が使用する NGen テクノロジの進化版と考えることができます。.NET Native と NGEN の主な違いはいくつかあります。

  • ランタイムの依存関係- NGEN は完全なデスクトップ CLR を使用し、.NET ネイティブはアプリケーション ローカルであるリファクタリングされたランタイム (mrt100_app.dll) を使用します。.NET ネイティブ ランタイムはリファクタリングされ、ほとんどの機能がアプリケーションからコード生成ツール チェーンに移動されました。これにより、はるかに小さくなり、プレイの支払いが増え、(うまくいけば) 実行時のデバッグが容易になります。.NET ネイティブ アプリケーションも自己完結型です。これは、アプリケーションにとって便利なプロパティです。
  • ネイティブ イメージの依存関係- NGEN イメージは、それが実行される CLR とその依存アセンブリの NGEN イメージの両方に緊密にバインドされています。これにより、たとえば、mscorlib.dll のバグ修正が行われたときに、ほぼすべての NGEN イメージを再生成する必要が生じます。
  • コンパイルの場所- .NET ネイティブの目的は、アプリ ストアでネイティブ コードを生成することです。NGEN は、エンド ユーザー デバイスでネイティブ コードを生成します。特定のクラスのデバイス (携帯電話、タブレットなど) では、エンド ユーザーのバッテリ寿命を生成するコードを無駄にしたくないということは想像に難くありません。また、ストアでコンパイルすると、.NET ネイティブはコンパイルにより多くの時間を費やすことができるため、NGEN が許容できるよりも多くの最適化を適用できます。
  • コード ジェネレーター- NGEN は JIT コンパイラーを使用してコードを生成します。.NET Native は Visual C++ コンパイラーのバックエンドを使用します。これにより、JIT の場合に適用するにはコストが高すぎる自動ベクトル化などの最適化を適用できます。
  • プログラム全体の分析- NGEN は一度に 1 つのアセンブリのコードを生成するため、NGEN イメージを複数のアプリケーション コンテキストで使用できます。.NET ネイティブは、アプリケーション パッケージ全体のコードを生成するため、より広範な最適化セットを適用できます (たとえば、実行時に使用されないコードを完全に破棄するなど)。これは、これらの最適化を可能な限り有効にするリファクタリングされたフレームワークと組み合わされています。
  • IL フォールバック- NGEN イメージには、アセンブリのネイティブ コードと MSIL の両方が含まれています (他のデータ構造の中でも特に)。実行時に何かが発生し、CLR が NGEN イメージで見つけられないネイティブ コードを必要とする場合、JITing にフォールバックできます。.NET Native の現在の開発者プレビューでは、ネイティブ コードのみがネイティブ イメージに存在します。これは、コードがイメージに存在しない場合、実行時に実行されないことを意味します。
于 2014-05-12T23:54:36.587 に答える
20

私の知る限り、Ngen はまだフレームワークに依存しています。

これは単なるパフォーマンスに関するものですか? それとも、Win32/64 にネイティブにコンパイルされ、ターゲット マシンに .NET Framework をインストールする必要がない (たとえば) C# コードをビルドすることも可能ですか?

その通りです。.NET ネイティブは、パフォーマンスだけでなく、生産性と一貫したデバイス エクスペリエンスにも関係しています。.NET ネイティブでは、マネージ言語を使用してコードを記述し、通常どおり MSIL パッケージをアップロードできます。ただし、アプリは完全に自己完結型のネイティブ コンパイル コードとしてエンド ユーザー デバイスに展開され (.NET ネイティブが運用環境に入った場合)、ターゲット デバイス/コンピューターの .NET Framework に依存しません。ご存知のように、.NET アプリケーションは広範囲に及びます。したがって、私たちは完全な .NET Framework にも大きな投資を行っています (たとえば、RyuJIT の CTP をリリースしたばかりです)。

Microsoft .NET ネイティブ FAQ

于 2014-04-07T08:43:03.837 に答える