.NET フレームワークが利用できないマシンで .NET アプリケーションを実行したいとしましょう。アプリケーションをネイティブ コードにコンパイルする方法はありますか?
16 に答える
Microsoft には、 MSIL をネイティブ コードにコンパイルする方法を説明する記事があります。
Ngenを使用できます。
Native Image Generator (Ngen.exe) は、マネージ アプリケーションのパフォーマンスを向上させるツールです。Ngen.exe は、コンパイルされたプロセッサ固有のマシン コードを含むファイルであるネイティブ イメージを作成し、ローカル コンピューターのネイティブ イメージ キャッシュにインストールします。ランタイムは、ジャストインタイム (JIT) コンパイラを使用して元のアセンブリをコンパイルする代わりに、キャッシュからのネイティブ イメージを使用できます。
残念ながら、プログラムを実行するにはフレームワークのライブラリが必要です。私が知っている MS .Net フレームワーク SDK には、必要なすべてのファイルを単一の実行可能ファイルにコンパイルできる機能はありません。
RemoteSoft は、.NET アプリケーションを、.NET がインストールされていなくても実行できるパッケージにコンパイルするツールを作成します。私はそれについての経験がありません:
Microsoft は、フレームワークをインストールしなくても .NET アプリケーションを実行できる.NET Native Previewを発表しました。
見てみましょう: http://blogs.msdn.com/b/dotnet/archive/2014/04/02/announce-net-native-preview.aspx
FAQ: http://msdn.microsoft.com/en-US/vstudio/dn642499.aspx
VS2013 用の Microsoft .NET Native は、http://msdn.microsoft.com/en-US/vstudio/dotnetnative からダウンロードできます。
それらのいくつかをテストしましたが、現時点で .NET 3.5 をサポートし、優れた仮想化スタックを備えているのはXenocode Postbuild だけです 。
ngen を使用する場合でも .NET フレームワークをインストールする必要がありますが、このようなツールを使用すると、すべてのマネージ コードがネイティブ コードにコンパイルされるため、フレームワークが存在しなくてもマシンにデプロイできます。
はい、ネイティブ イメージ ジェネレーターであるNgenを使用します。ただし、次の点に注意する必要があります。
- 実行可能ファイルを実行するには、CLR が必要です。
- CLR は、アセンブリが実行されている環境に基づいてアセンブリを動的に最適化しません (たとえば、486 対 586 対 686 など)。
全体として、アプリケーションの起動時間を短縮する必要がある場合にのみ、Ngen を使用する価値があります。
あなたはできる!ただし、.NET 1.1 に制限されています (ジェネリックはありません): Mono Ahead-Of-Time コンパイル (AOT)
ただし、これはコンパイルが実際にはネイティブであることを意味するため、単一のバイトコード アセンブリをデプロイすることはできなくなり、プラットフォームごとに 1 つ必要になります。
元々、iPhone 用の .NET や Mono がないために設計されたもので、それが MonoTouch の作成方法です。
これは、.NET Native と呼ばれる新しいプリコンパイル テクノロジを使用して行うことができます。ここで確認してください: http://msdn.microsoft.com/en-US/vstudio/dotnetnative
現在、Windows ストア アプリでのみ利用できます。単一コンポーネントのリンクを実行します。したがって、.NET Framework ライブラリはアプリに静的にリンクされます。すべてがネイティブにコンパイルされ、IL アセンブリはデプロイされなくなりました。アプリは CLR に対して実行されるのではなく、マネージド ランタイム (Mrt.dll) と呼ばれる必要最小限の最適化されたランタイムに対して実行されます。
前述のように、NGEN はミックス コンパイル モデルを使用し、動的なシナリオでは IL と JIT に依存していました。.NET ネイティブは JIT を使用しませんが、さまざまな動的シナリオをサポートします。コード作成者は、 ランタイム ディレクティブを利用して、サポートしたい動的シナリオに関するヒントを .NET ネイティブ コンパイラに提供する必要があります。
ngen.exe を使用してネイティブ イメージを生成できますが、元の非ネイティブ コードも同様に配布する必要があり、ターゲット マシンにフレームワークをインストールする必要があります。
本当にあなたの問題を解決しません。
.NET の性質は、MSIL にコンパイルされたアプリをインストールできることです。その後、JIT または Ngen によって、MSIL がネイティブ コードにコンパイルされ、ローカルのキャッシュに格納されます。.NET フレームワークから独立して実行できる真のネイティブ .exe を生成することを意図したものではありませんでした。
これを行うハックがあるかもしれませんが、私には安全ではないように思えます。動的アセンブリの読み込み、MSIL コード生成など、フレームワークを必要とするダイナミクスが多すぎます。
ネイティブにコンパイルする主な理由は、コードを保護することです。それ以外の場合、コンパイルされた MSIL は、クライアントのコンピューターにソース コードを展開するようなものです。
NGEN はネイティブにコンパイルされますが、IL コードをデプロイする必要もあります。この目的は単に起動時間を短縮することですが、これも役に立ちません。
CoreRt はアルファ版であり、単純な helloworld タイプのアプリでのみ動作します。
.Net Core は単一の実行可能ファイルにコンパイルされますが、ネイティブ exe ではありません。これは単なる IL コードの圧縮ファイルであり、実行中に一時フォルダーにコードを解凍します。
Microsoft からの私の単純な質問は、RyuJIT が IL をオンザフライでネイティブにコンパイルできるのであれば、なぜ同じ IL を事前に (AOT) コンパイルできないのかということです。
無理だと思います。.NET FW も配布する必要があります。.NET アプリをネイティブ コードにコンパイルする場合は、NGenツールを使用します