C++ コードがローカル マシンで直接実行されることは知っています。また、NGen.exe を使用して C# コードをネイティブ コードにコンパイルできることも知っています。私の質問は
ネイティブ コード ジェネレーター NGen.exe を使用して C# コードをネイティブ コードにコンパイルする場合、それを実行するには .NET フレームワークが必要ですか?
実際、C++ コードを Windows 実行可能ファイルにコンパイルする場合でも、Win32 dll やその他のものが必要です。プログラムは、プログラム以外に何もない CPU では実行できません。
C# についても同じ話です。C# をネイティブ コードにコンパイルする場合、.NET ランタイムの一部である JIT コンパイラは必要ありません。ただし、.NET ランタイムのその他の部分はすべて必要です。
たとえば、すべてのクラスを含む .NET フレームワークは、プログラムにリンクされていません。必要なすべての .NET クラスをバイナリに入れると、単純なHello world
アプリが巨大になります。
monoを使用して、静的にリンクされたフレームワークライブラリですべてがプリコンパイルされ、個別のランタイムを必要としないC#アプリを構築できます。
しかし、私はそれをお勧めしません。静的リンクにすべてが利用できるわけではありません。JITterを使用することの1つは、マシン固有の最適化をより有効に活用できるようになるため、すべてのデプロイメントでコードが平均して高速になることです。それはまた、モノでさえ箱から出して行うように設定されているものではありません。
はい、アプリが使用するライブラリはフレームワークから取得されるため、フレームワークが必要です。
NGen を使用すると、コードがネイティブ コードでコンパイルされるだけでなく、フレームワーク コードのチャンクも「ネイティブ化」され、アプリが使用する適切な部分だけが使用されます。
これはすべて、アセンブリ (exe または dll) 物理バイトを変更しません。これにより、IL がネイティブにコンパイルされ、このネイティブ バイトがコンパイル済みアセンブリ キャッシュに格納されます。
コンパイルされたアセンブリ キャッシュ内の参照には、いくつかのフレームワーク コンポーネントが必要です。特に、最初からネイティブ コードであるフレームワーク コアが必要です。