EXEを出力する.NET Coreコンソールアプリケーションをビルドする


413

.NET Core 1.0を対象とするコンソールアプリケーションプロジェクトの場合、ビルド中に.exeを出力する方法がわかりません。プロジェクトはデバッグで問題なく実行されます。

私はプロジェクトを公開しようとしましたが、それも機能しません。EXEファイルはプラットフォーム固有であるため、理にかなっていますが、方法がなければなりません。私の検索では、project.jsonを使用していた古い.NET Coreバージョンへの参照のみが表示されました。

私が構築または公開するときはいつでも、これが私が得るすべてです:

ビルドディレクトリ



2
@geekzster削除を取り消してください-OPの質問に回答しなかったのはわかっていますが、私の質問に回答したので、他の多くの人がそう言ったのでdotnet <path>.dllはないかと疑っています(dotnet run <path>.dll明らかな理由から、考えたりタイプしたりせずに成功していませんでした)!(これは、同様の回答のセットを持つ他の質問のためにこれが閉じられた場合に良いと
思い

回答:


480

デバッグの目的で、DLLファイルを使用できます。を使用して実行できますdotnet ConsoleApp2.dll。EXEファイルを生成する場合は、自己完結型アプリケーションを生成する必要があります。

自己完結型アプリケーション(WindowsではEXE)を生成するには、ターゲットランタイム(ターゲットとするオペレーティングシステムに固有)を指定する必要があります。

.NET Core 2.0より前のバージョンのみ:最初に、ターゲットランタイムのランタイム識別子を.csprojファイルに追加します(サポートされるRIDのリスト):

<PropertyGroup>
    <RuntimeIdentifiers>win10-x64;ubuntu.16.10-x64</RuntimeIdentifiers>
</PropertyGroup>

.NET Core 2.0以降、上記の手順は不要になりました

次に、アプリケーションを公開するときに目的のランタイムを設定します。

dotnet publish -c Release -r win10-x64
dotnet publish -c Release -r ubuntu.16.10-x64

15
これはCLIでのみ実行できると思います。ところで、.netコア2以降RuntimeIdentifierでは、csprojにを設定する必要はありません。
meziantou 2017

26
.NET Core 2.0の場合、これはVisual Studioで実行できますか?または、これらのコマンドを手動で入力する必要がありますか?
Tomasz Sikora 2017年

77
Hello worldコンソールアプリ用に60MB以上!
shox 2018年

13
@mikolaj「ポータブル」のターゲットランタイムは1つだけです。すべてのターゲットを取り込む方法はありますか?コマンドラインを使用してもかまいませんが、それは一歩後退だと思います。
gsharp 2018年

10
これはスタンドアロンの実行可能ファイルを作成しません。これにより、他のファイルのホスト(つまり、リリースフォルダー内)と共に実行可能ファイルが作成されます。独自のファイルを持ついくつかのサブフォルダーを含みます。真のスタンドアロン実行可能ファイルを作成する方法はありますか?
マシュー

122

更新(31-OCT-2019)

GUIを介してこれを実行したい人のために:

  • Visual Studio 2019を使用しています
  • .NET Core 3.0がインストールされている(Visual Studio 2019の最新バージョンに含まれている)
  • 単一のファイルを生成したい

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

注意

このような小さなアプリケーションの大きなファイルサイズに注意してください。

ここに画像の説明を入力してください

「PublishTrimmed」プロパティを追加できます。アプリケーションには、アプリケーションで使用されるコンポーネントのみが含まれます。注意:リフレクションを使用している場合は、これを行わないでください

ここに画像の説明を入力してください

もう一度公開

ここに画像の説明を入力してください


前の投稿

Visual Studioを使用していて、GUIでこれを実行したい場合は、以下の手順を参照してください。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください


19
残念なことに、出力は古い.NET Frameworkのような1つのEXEではなく、ファイルの束です。
Tomas Karban

2
@Tomas Karban-展開モードを「自己完結型」に変更するまでは、変更後、exeファイルも公開フォルダに表示されました:-)
Mariusz

@TomasKarban .NET Coreは、汎用のランタイムではありません。これは、1)クラウド/コンテナーのデプロイメント、2)マルチプラットフォーム用に特別に設計されています。これは一時的なものでもあります。すべての.NETをオープンソースにすることができるようになるまで、これは単なる「迅速な」ハックです。.NET 5.0は、次の汎用.NETになる予定です。
Luaan

3
それでも、.NET Coreを対象とする場合、IDE for .NETが最も基本的な機能をサポートしていないのはばかげています。そしてそれこそが、クロスプラットフォームのコマンドラインアプリケーション(コンパイラなど)を作成するために誰もが対象とする必要のあることです。
モニカを

18

以下は、出力ディレクトリに、

  • すべてのパッケージ参照
  • 出力アセンブリ
  • ブートストラップexe

ただし、すべての.NET Coreランタイムアセンブリが含まれているわけではありません。

<PropertyGroup>
  <Temp>$(SolutionDir)\packaging\</Temp>
</PropertyGroup>

<ItemGroup>
  <BootStrapFiles Include="$(Temp)hostpolicy.dll;$(Temp)$(ProjectName).exe;$(Temp)hostfxr.dll;"/>
</ItemGroup>

<Target Name="GenerateNetcoreExe"
        AfterTargets="Build"
        Condition="'$(IsNestedBuild)' != 'true'">
  <RemoveDir Directories="$(Temp)" />
  <Exec
    ConsoleToMSBuild="true"
    Command="dotnet build $(ProjectPath) -r win-x64 /p:CopyLocalLockFileAssemblies=false;IsNestedBuild=true --output $(Temp)" >
    <Output TaskParameter="ConsoleOutput" PropertyName="OutputOfExec" />
  </Exec>
  <Copy
    SourceFiles="@(BootStrapFiles)"
    DestinationFolder="$(OutputPath)"
  />

</Target>

ここのサンプルにまとめました:https : //github.com/SimonCropp/NetCoreConsole


私のCに($ Temp)に点を除い:\ Users \ユーザーxxxは\明らかに削除することはできません/クリーニングのAppData \ローカル\温度-またそうするadviceableある
Adaptabi

1
@Adaptabi Tempは、スクリプトの開始時にプロパティとして定義されます
Simon

2

.batファイルを使用できる場合は、DLLファイルと同じ名前のbatファイルを作成して(同じフォルダーに配置して)、次の内容を貼り付けます。

dotnet %~n0.dll %*

明らかに、これはマシンに.NET Coreがインストールされており、グローバルに利用できることを前提としています。

c:\> "path\to\batch\file" -args blah

(この回答はChetのコメントに基づいています。)


0

ここに私のハッキーな回避策があります-独自の名前と引数を読み取ってを呼び出すコンソールアプリケーション(.NET Framework)を生成しますdotnet [nameOfExe].dll [args]

もちろん、これは.NETがターゲットマシンにインストールされていることを前提としています。

これがコードです。自由にコピーしてください!

using System;
using System.Diagnostics;
using System.Text;

namespace dotNetLauncher
{
    class Program
    {
        /*
            If you make .NET Core applications, they have to be launched like .NET blah.dll args here
            This is a convenience EXE file that launches .NET Core applications via name.exe
            Just rename the output exe to the name of the .NET Core DLL file you wish to launch
        */
        static void Main(string[] args)
        {
            var exePath = AppDomain.CurrentDomain.BaseDirectory;
            var exeName = AppDomain.CurrentDomain.FriendlyName;
            var assemblyName = exeName.Substring(0, exeName.Length - 4);
            StringBuilder passInArgs = new StringBuilder();
            foreach(var arg in args)
            {
                bool needsSurroundingQuotes = false;
                if (arg.Contains(" ") || arg.Contains("\""))
                {
                    passInArgs.Append("\"");
                    needsSurroundingQuotes = true;
                }
                passInArgs.Append(arg.Replace("\"","\"\""));
                if (needsSurroundingQuotes)
                {
                    passInArgs.Append("\"");
                }

                passInArgs.Append(" ");
            }
            string callingArgs = $"\"{exePath}{assemblyName}.dll\" {passInArgs.ToString().Trim()}";

            var p = new Process
            {
                StartInfo = new ProcessStartInfo("dotnet", callingArgs)
                {
                    UseShellExecute = false
                }
            };

            p.Start();
            p.WaitForExit();
        }
    }
}

6
とにかく追加のファイルを作成する場合は、次の内容を含むbatファイルを作成してみませんかdotnet [nameOfExe].dll %*
Chet
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.