.NETアプリケーションをネイティブコードにコンパイルする方法


88

.NETフレームワークが使用できないマシンで.NETアプリケーションを実行したい場合。アプリケーションをネイティブコードにコンパイルする方法はありますか?

回答:


45

Microsoftには、MSILをネイティブコードにコンパイルする方法を説明した記事があります。

Ngenを使用できます。

ネイティブイメージジェネレーター(Ngen.exe)は、管理対象アプリケーションのパフォーマンスを向上させるツールです。Ngen.exeは、ネイティブイメージ(コンパイルされたプロセッサ固有のマシンコードを含むファイル)を作成し、ローカルコンピューターのネイティブイメージキャッシュにインストールします。ランタイムは、元のアセンブリをコンパイルするためにジャストインタイム(JIT)コンパイラを使用する代わりに、キャッシュからのネイティブイメージを使用できます。

残念ながら、プログラムを実行するには、フレームワークのライブラリが必要です。必要なすべてのファイルを1つの実行可能ファイルにコンパイルできるMS .NetフレームワークSDKで私が知っている機能はありません。


1
公演以外で使う理由は他にない。CLRコードは以前と同様に読み取ることができますが、.NETが必要です。したがって、残念なことに、私が大きな問題であると考えるものを修正するツールは提供されませんでした(誰でもあなたの高レベルのコードをそのまま見ることができます)
MasterMastic

Espoに同意しません。灰色のテキストは、CLRを意味する "ランタイム"を示しているため、Chrisが正しく指摘している.NET Frameworkが登場します。ただし、NGenポイントは本当です。問題は、CLR / Runtime / .NET Frameworkを使用しなくても、すべて同じであることです。
学習者

1
-それは、.NET Frameworkのようなルックスは、最終的にはネイティブコンパイラを取得している、時間がしかし、興奮しているmsdn.microsoft.com/en-US/vstudio/dotnetnative
ferventcoder

.NETに依存しない実行可能ファイルが必要な場合は、.NET実行可能ファイルとその依存関係ツリー内のすべてをILMergeし、次にNgenを実行します

24

RemoteSoftは、.NETアプリケーションを.NETがインストールされていなくても実行できるパッケージにコンパイルするツールを作成します。私はそれについての経験がありません:

RemoteSoftサラマンダー


5
それは私が今まで聞いた中でフレームワークを必要とせずにそれを行う唯一のツールです。もちろん、それは1249ドルかかります。
Slapout 2009年

3
過去数年間、情報や評価を得るために何度か試してみましたが、価格やデモに関するメールが返されないので、彼らの製品は少し疑わしいと思います。
codenheim、2014年

21

ここでの他の回答のいくつかで述べたように、.NET Nativeツールを使用して、アプリをネイティブマシンコードにコンパイルできます。ただし、それらの回答とは異なり、その方法を説明します。

手順:

  1. 新しい.NET Coreツールチェーンの一部であるdotnet CLI(コマンドラインインターフェイス)ツールをインストールします。これを使用してアプリをコンパイルします。あなたはそれについてここで良い記事を見つけることができます

  2. シェルプロンプトを開きcd、アプリのディレクトリに移動します。

  3. これを入力してください:

    dotnet compile --native

それでおしまい!完了すると、アプリは次のように1つのバイナリにコンパイルされます。

ネイティブコンパイルされた.NET Core EXE

スタンドアロンの実行可能ファイルになります。PDB、アセンブリ、構成ファイルは含まれていません(フレイ!)。


または、さらに高速なプログラムが必要な場合は、次のコマンドを実行できます。

dotnet compile --native --cpp

これにより、(RyuJITではなく)C ++コードジェネレーターを使用してプログラムが最適化されるため、アプリはAOTシナリオ向けにさらに最適化されます。

これについて詳しくは、dotnet CLI GitHubリポジトリをご覧ください。


注:これは、.NET Coreでビルドされたプロジェクトに対してのみサポートされています。(ただし、+ 1)
Mahmoud Al-Qudsi 2017年

.NET NativeがWindows 10を必要とするという非常に重要な詳細を忘れました
Elmue

19

私はそれらのいくつかをテストしてきたし、この時点で.NET 3.5をサポートし、また偉大な仮想化スタックを持っている唯一のものであるXenocode ポストビルド

ngenを使用しても、.NETフレームワークをインストールする必要がありますが、ツールを使用すると、すべてのマネージコードがネイティブコードにコンパイルされるため、フレームワークがなくてもマシンにデプロイできます。



11

はい、ネイティブイメージジェネレーターのNgenを使用します。ただし、次のことに注意する必要があります。

  • 実行可能ファイルを実行するには、CLRが必要です。
  • CLRは、それが実行される環境(486対586対686など)に基づいてアセンブリを動的に最適化しません。

全体として、アプリケーションの起動時間を短縮する必要がある場合にのみ、Ngenを使用する価値があります。


9

あなたはできる!ただし、.NET 1.1に制限されています(ジェネリックはありません): Mono Ahead-Of-Timeコンパイル(AOT)

ただし、これはコンパイルが実際にネイティブであることを意味するため、単一のバイトコードアセンブリを1つデプロイできなくなり、プラットフォームごとに1つ必要になります。

もともとはiPhone用の.NETやMonoがないために設計されたので、MonoTouchを作成したのはそのためです。


6

これは、.NET Nativeと呼ばれる新しいプリコンパイルテクノロジを使用して行うことができます。こちらで確認してください:http : //msdn.microsoft.com/en-US/vstudio/dotnetnative

現在、Windowsストアアプリでのみ利用できます。単一コンポーネントのリンクを実行します。したがって、.NET Frameworkライブラリは静的にアプリにリンクされます。すべてがネイティブにコンパイルされ、ILアセンブリは展開されなくなりました。アプリはCLRに対して実行されませんが、マネージランタイム(Mrt.dll)と呼ばれる、ストリップされて最適化されたランタイム

上記のように、NGENは混合コンパイルモデルを使用し、動的シナリオではILとJITに依存していました。.NET NativeはJITを利用しませんが、さまざまな動的シナリオをサポートします。コード作成者は、ランタイムディレクティブを利用して、サポートする動的シナリオで.NETネイティブコンパイラにヒントを提供する必要があり ます。


1
+1-これが起こるまで私は何年も待っていました。世界の「仮想マシン」への夢中になってコースが早く実行されることを期待していましたが、それでも起こっています。ネイティブコンパイルが復活するのを期待しています。おっしゃるように、現時点ではウィンドウズストアアプリ向けですが、デスクトップ市場が同等の扱いを要求するのは時間の問題です。
codenheim、2014年

4

ngen.exeを使用してネイティブイメージを生成できます、元の非ネイティブコードも配布する必要があり、ターゲットマシンにフレームワークをインストールする必要があります。

それは本当にあなたの問題を解決しません。


2

2019回答:dotnet / corertを使用してください。.NET Coreプロジェクトをスタンドアロン.exeファイルにコンパイルできます。依存関係なし(のようなシステムライブラリを除くkernel32.dll)。これはまさにOPに必要なものです。

GitHubホームページから:

CoreRTコンパイラは、マネージド.NET Coreアプリケーションを、展開が容易なネイティブ(アーキテクチャ固有)の単一ファイル実行可能ファイルにコンパイルできます。また、他のプログラミング言語で作成されたアプリケーションで使用できるスタンドアロンの動的または静的ライブラリを生成することもできます。


1

.NETの性質は、MSILにコンパイルされたアプリをインストールできることです。その後、JITまたはNgenによって、MSILはネイティブコードにコンパイルされ、キャッシュにローカルに保存されます。.NETフレームワークから独立して実行できる真のネイティブ.exeを生成することを意図したものではありません。

多分これを行ういくつかのハックがあるかもしれませんが、それは私にとって安全に聞こえません。動的なアセンブリの読み込み、MSILコードの生成など、フレームワークを必要とするダイナミクスが多すぎます。


0

ネイティブにコンパイルする主な理由は、コードを保護することです。それ以外の場合、コンパイルされたMSILは、クライアントのマシンにソースコードをデプロイするようなものです。

NGENはネイティブにコンパイルされますが、ILコードを展開する必要もあります。この目的は、起動時間を短縮することだけですが、役に立たないこともあります。

CoreRtはアルファ版であり、単純なhelloworldタイプのアプリでのみ機能します。

.Net Coreは単一の実行可能ファイルにコンパイルされますが、ネイティブexeではありません。これはILコードの圧縮ファイルであり、実行中にコードを一時フォルダーに解凍します。

Microsoftからの私の単純な質問は、RyuJITがILをその場でネイティブにコンパイルできる場合、なぜ同じILを事前(AOT)にコンパイルできないのかということです。


「CoreRtはアルファ版であり、単純なhelloworldタイプのアプリでのみ機能します。」これは本当ではありません-Steamにはhelloworldよりも複雑なゲーム(例:streets4rage.com)があります。
Sウェイ

ただし、CoreRTはWinformアプリケーションをコンパイルできません。Winformアプリケーションをコンパイルできる別のオンラインコンパイラ(dotnetnative.online)を見つけました
Rahim Surani


-3

それは不可能だと思います。.NET FWも配布する必要があります。.NETアプリをネイティブコードにコンパイルする場合は、NGen ツールを使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.