web-dev-qa-db-ja.com

Visual Studioでスタンドアロンの実行可能ファイル(.exe)にコンパイルする

visual Studioでスタンドアロンのexeを作成するにはどうすればよいですか。ユーザーが小さなコンソールアプリケーションをインストールするのは嫌だと思う、単純なコンソールアプリケーションです。 Visual Studioコマンドプロンプトを使用して、単純なcppファイルをコンパイルしました。 .NETフレームワークがインストールされていなくても、exeは機能しますか?ネイティブC++コードを使用しました。

37
Mohit Deshpande

管理された環境(C#およびVB.NETで記述されたものを含む)を使用するものには、.NETフレームワークが必要です。そのシナリオで.EXEを単純に再配布できますが、まだ持っていない場合は適切なフレームワークをインストールする必要があります。

21
Joe

プロジェクトフォルダー内には、binフォルダーがあります。 binフォルダー内には、リリースとデバッグの2つのフォルダーがあります。洗練された.exeの場合、Releaseフォルダーに移動します。

それがあなたの尋ねるものかどうかはよくわかりません

55
Marlon

私があなたを正しく理解していれば、はい、できますが、Visual Studioの下ではわかりません(私の知る限り)。コンパイラーに実際のスタンドアロン実行可能ファイル(他の言語と同様にC#を使用することを意味する)を生成させるには、mkbundleプログラム(Monoに同梱)を使用します。これにより、C#アプリが依存関係のない実際の実行可能ファイルにコンパイルされます。

インターネットについては、これについて多くの誤解があります。一部の人々が述べているように、.netフレームワークの目的を損なうことはありません。これらの機能を最初から使用しなかった場合、.netフレームワークの将来の機能をどのように失うことができるのでしょうか。また、アプリの更新プログラムを出荷するとき、インストーラーをビルドする前にmkbundleプロセッサーを介して実行することは厳密な作業ではありません。また、アプリをネイティブの速度で実行することに伴う速度の利点もあります(現在はISネイティブ)であるため)。

C++またはDelphiには同じシステムがありますが、中間のMSILレイヤーはありません。そのため、ネームスペースまたはソースファイル(Delphiではユニットと呼ばれる)を使用する場合、それらはコンパイルされ、最終的なバイナリに含まれます。したがって、最終的なバイナリは大きくなります(実際のアプリの「通常」サイズをお読みください)。 .netで使用するフレームワークの部分についても同じことが言えます。これらはアプリにも含まれています。ただし、スマートリンクはかなりの量を削ります。

それが役に立てば幸い!

19

@Marlonに同意します。リリース構成でC#プロジェクトをコンパイルすると、プロジェクトの「bin/Release」フォルダーにアプリケーションの実行可能ファイルがあります。これは、単純なアプリケーションで機能する必要があります。

ただし、アプリケーションが外部dllに依存している場合は、VisualStudioでSetupProjectを作成することをお勧めします。そうすることで、プロジェクトウィザードはアプリケーションのすべての依存関係を検出し、それら(ライブラリ)をインストールフォルダーに追加します。最後に、ユーザーのコンピューターでセットアップを実行し、ソフトウェアをインストールするだけです。

私は、C#で作成された小さなコンソールアプリケーションをそのまま展開する際に問題が発生したことはありません。ぶつかることのできる唯一の問題は、.NETフレームワークへの依存関係になりますが、それでも大きな問題にはなりません。フレームワークのバージョン2.0を使用してみてください。これは、ほとんどのPCに既に搭載されているはずです。

ネイティブのアンマネージC++を使用すると、.NETフレームワークに依存しないため、本当に安全である必要があります。実行可能ファイルと付随ファイル(存在する場合)を取得し、そのまま展開します。必要ない場合はインストールする必要はありません。

1
alex

メインdllにすべてのdllを埋め込むことができます。参照: コンパイルされた実行可能ファイルへのDLLの埋め込み

すべてのプロジェクトファイルを1つの.exeにマージすることで、dllの地獄を回避することを質問者が求めることを行うことはできないと思います。

フレームワークの問題は、ニシンです。発生する問題は、1つのライブラリに依存する複数のプロジェクトがある場合、ライブラリの同期を保つことがPITAであるということです。ライブラリが変更されるたびに、ライブラリに依存し、更新されていないすべての.exeは恐ろしく死にます。

ある回答のようにCを学ぶように人々に言うことは、慢で無知です。

0
PHB