説明
C#のコンソールアプリケーションをPowerShellを使用してコマンドラインで作成し、
exeファイルをダブルクリックで実行したい。
前提条件
.NET SDKがインストールされている必要がある。
インストールされているか下記で確認できる。
dotnet --version
# 実行結果
8.0.302
バージョンが表示されていればOK。
プロジェクトを作成するフォルダへ移動
PowerShellを起動し、プロジェクトフォルダを作成するフォルダまで移動済み。
SET-LOCATION SAMPLE02
(SAMPLE02内にプロジェクトを作成するつもり)
C#コンソールプロジェクトを新規作成
「MyHelloWorldApp」プロジェクトを作成する。
dotnet new console -n MyHelloWorldApp
MyHelloWorldApp内の生成物を確認する。
tree /f
# 実行結果
C:.
└─MyHelloWorldApp
│ MyHelloWorldApp.csproj
│ Program.cs
│
└─obj
MyHelloWorldApp.csproj.nuget.dgspec.json
MyHelloWorldApp.csproj.nuget.g.props
MyHelloWorldApp.csproj.nuget.g.targets
project.assets.json
project.nuget.cache
コードの編集(確認)
MyHelloWorldApp/Program.csのコードをメモ帳で確認する。
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");
MyHelloWorldApp/Program.csのコードをメモ帳で編集する。
using System;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
// アプリケーションの終了を待つために、キー入力を待機
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
}
Console.ReadKey()
を追加することで、コンソールウィンドウがすぐに閉じることを防ぐ。
(実行後にキー入力を待ちにする)
プロジェクトのビルド
MyHelloWorldAppに移動する。
SET-LOCATION .\MyHelloWorldApp\
プロジェクトをビルドして実行可能な.exeファイルを生成する。
dotnet build
# 実行結果
Determining projects to restore...
復元対象のすべてのプロジェクトは最新です。
MyHelloWorldApp -> C:\Users\0905s\MY_WORK\C#\SAMPLE02\MyHelloWorldApp\bin\Debug\net8.0\MyHelloWorldApp.dll
ビルドに成功しました。
0 個の警告
0 エラー
経過時間 00:00:02.60
MyHelloWorldApp内の生成物を確認する。
C:.
│ MyHelloWorldApp.csproj
│ Program.cs
│
├─bin
│ └─Debug
│ └─net8.0
│ MyHelloWorldApp.deps.json
│ MyHelloWorldApp.dll
│ MyHelloWorldApp.exe
│ MyHelloWorldApp.pdb
│ MyHelloWorldApp.runtimeconfig.json
│
└─obj
│ MyHelloWorldApp.csproj.nuget.dgspec.json
│ MyHelloWorldApp.csproj.nuget.g.props
│ MyHelloWorldApp.csproj.nuget.g.targets
│ project.assets.json
│ project.nuget.cache
│
└─Debug
└─net8.0
│ .NETCoreApp,Version=v8.0.AssemblyAttributes.cs
│ apphost.exe
│ MyHelloWorldApp.AssemblyInfo.cs
│ MyHelloWorldApp.AssemblyInfoInputs.cache
│ MyHelloWorldApp.assets.cache
│ MyHelloWorldApp.csproj.CoreCompileInputs.cache
│ MyHelloWorldApp.csproj.FileListAbsolute.txt
│ MyHelloWorldApp.dll
│ MyHelloWorldApp.GeneratedMSBuildEditorConfig.editorconfig
│ MyHelloWorldApp.genruntimeconfig.cache
│ MyHelloWorldApp.GlobalUsings.g.cs
│ MyHelloWorldApp.pdb
│
├─ref
│ MyHelloWorldApp.dll
│
└─refint
MyHelloWorldApp.dll
ビルドが成功すると、プロジェクトフォルダ内のbin/Debug/net8.0フォルダ内に
実行可能な.exeファイルが生成される。
ダブルクリックで実行可能。
リリースビルドの作成
デプロイメントや配布用に最適化されたリリースビルドを作成する場合は、以下のコマンドを使用してリリースモードでビルドする。
dotnet publish -c Release
# 実行結果
Determining projects to restore...
復元対象のすべてのプロジェクトは最新です。
MyHelloWorldApp -> C:\Users\0905s\MY_WORK\C#\SAMPLE02\MyHelloWorldApp\bin\Release\net8.0\MyHelloWorldApp.dll
MyHelloWorldApp -> C:\Users\0905s\MY_WORK\C#\SAMPLE02\MyHelloWorldApp\bin\Release\net8.0\publish\
C:.
│ MyHelloWorldApp.csproj
│ Program.cs
│
├─bin
│ ├─Debug
│ │ └─net8.0
│ │ MyHelloWorldApp.deps.json
│ │ MyHelloWorldApp.dll
│ │ MyHelloWorldApp.exe
│ │ MyHelloWorldApp.pdb
│ │ MyHelloWorldApp.runtimeconfig.json
│ │
│ └─Release
│ └─net8.0
│ │ MyHelloWorldApp.deps.json
│ │ MyHelloWorldApp.dll
│ │ MyHelloWorldApp.exe
│ │ MyHelloWorldApp.pdb
│ │ MyHelloWorldApp.runtimeconfig.json
│ │
│ └─publish
│ MyHelloWorldApp.deps.json
│ MyHelloWorldApp.dll
│ MyHelloWorldApp.exe
│ MyHelloWorldApp.pdb
│ MyHelloWorldApp.runtimeconfig.json
│
└─obj
│ MyHelloWorldApp.csproj.nuget.dgspec.json
│ MyHelloWorldApp.csproj.nuget.g.props
│ MyHelloWorldApp.csproj.nuget.g.targets
│ project.assets.json
│ project.nuget.cache
│
├─Debug
│ └─net8.0
│ │ .NETCoreApp,Version=v8.0.AssemblyAttributes.cs
│ │ apphost.exe
│ │ MyHelloWorldApp.AssemblyInfo.cs
│ │ MyHelloWorldApp.AssemblyInfoInputs.cache
│ │ MyHelloWorldApp.assets.cache
│ │ MyHelloWorldApp.csproj.CoreCompileInputs.cache
│ │ MyHelloWorldApp.csproj.FileListAbsolute.txt
│ │ MyHelloWorldApp.dll
│ │ MyHelloWorldApp.GeneratedMSBuildEditorConfig.editorconfig
│ │ MyHelloWorldApp.genruntimeconfig.cache
│ │ MyHelloWorldApp.GlobalUsings.g.cs
│ │ MyHelloWorldApp.pdb
│ │
│ ├─ref
│ │ MyHelloWorldApp.dll
│ │
│ └─refint
│ MyHelloWorldApp.dll
│
└─Release
└─net8.0
│ .NETCoreApp,Version=v8.0.AssemblyAttributes.cs
│ apphost.exe
│ MyHelloWorldApp.AssemblyInfo.cs
│ MyHelloWorldApp.AssemblyInfoInputs.cache
│ MyHelloWorldApp.assets.cache
│ MyHelloWorldApp.csproj.CoreCompileInputs.cache
│ MyHelloWorldApp.csproj.FileListAbsolute.txt
│ MyHelloWorldApp.dll
│ MyHelloWorldApp.GeneratedMSBuildEditorConfig.editorconfig
│ MyHelloWorldApp.genruntimeconfig.cache
│ MyHelloWorldApp.GlobalUsings.g.cs
│ MyHelloWorldApp.pdb
│ PublishOutputs.805c2eaa13.txt
│
├─ref
│ MyHelloWorldApp.dll
│
└─refint
MyHelloWorldApp.dll
MyHelloWorldApp/bin/Release/net8.0/publish/MyHelloWorldApp.exe 最適化されていて、
デバッグ情報は含まれていないため、配布に適している(らしい)
単一ファイルのリリースビルド
すべての依存関係を含む単一ファイルの実行可能ファイルを作成する。
こっちが本命。
dotnet publish -c Release -r win-x64 --self-contained true /p:PublishSingleFile=true
# 実行結果
Determining projects to restore...
C:\Users\0905s\MY_WORK\C#\SAMPLE02\MyHelloWorldApp\MyHelloWorldApp.csproj を復元しました (547 ミリ秒)。
MyHelloWorldApp -> C:\Users\0905s\MY_WORK\C#\SAMPLE02\MyHelloWorldApp\bin\Release\net8.0\win-x64\MyHelloWorldApp.dll
MyHelloWorldApp -> C:\Users\0905s\MY_WORK\C#\SAMPLE02\MyHelloWorldApp\bin\Release\net8.0\win-x64\publish\
C:.
│ MyHelloWorldApp.csproj
│ Program.cs
│
├─bin
│ ├─Debug
│ │ └─net8.0
│ │ MyHelloWorldApp.deps.json
│ │ MyHelloWorldApp.dll
│ │ MyHelloWorldApp.exe
│ │ MyHelloWorldApp.pdb
│ │ MyHelloWorldApp.runtimeconfig.json
│ │
│ └─Release
│ └─net8.0
│ │ MyHelloWorldApp.deps.json
│ │ MyHelloWorldApp.dll
│ │ MyHelloWorldApp.exe
│ │ MyHelloWorldApp.pdb
│ │ MyHelloWorldApp.runtimeconfig.json
│ │
│ ├─publish
│ │ MyHelloWorldApp.deps.json
│ │ MyHelloWorldApp.dll
│ │ MyHelloWorldApp.exe
│ │ MyHelloWorldApp.pdb
│ │ MyHelloWorldApp.runtimeconfig.json
│ │
│ └─win-x64
│ │ clretwrc.dll
│ │ clrgc.dll
│ │ clrjit.dll
│ │ coreclr.dll
│ │ createdump.exe
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
│ │ WindowsBase.dll
│ │
│ └─publish
│ MyHelloWorldApp.exe
│ MyHelloWorldApp.pdb
│
└─obj
│ MyHelloWorldApp.csproj.nuget.dgspec.json
│ MyHelloWorldApp.csproj.nuget.g.props
│ MyHelloWorldApp.csproj.nuget.g.targets
│ project.assets.json
│ project.nuget.cache
│
├─Debug
│ └─net8.0
│ │ .NETCoreApp,Version=v8.0.AssemblyAttributes.cs
│ │ apphost.exe
│ │ MyHelloWorldApp.AssemblyInfo.cs
│ │ MyHelloWorldApp.AssemblyInfoInputs.cache
│ │ MyHelloWorldApp.assets.cache
│ │ MyHelloWorldApp.csproj.CoreCompileInputs.cache
│ │ MyHelloWorldApp.csproj.FileListAbsolute.txt
│ │ MyHelloWorldApp.dll
│ │ MyHelloWorldApp.GeneratedMSBuildEditorConfig.editorconfig
│ │ MyHelloWorldApp.genruntimeconfig.cache
│ │ MyHelloWorldApp.GlobalUsings.g.cs
│ │ MyHelloWorldApp.pdb
│ │
│ ├─ref
│ │ MyHelloWorldApp.dll
│ │
│ └─refint
│ MyHelloWorldApp.dll
│
└─Release
└─net8.0
│ .NETCoreApp,Version=v8.0.AssemblyAttributes.cs
│ apphost.exe
│ MyHelloWorldApp.AssemblyInfo.cs
│ MyHelloWorldApp.AssemblyInfoInputs.cache
│ MyHelloWorldApp.assets.cache
│ MyHelloWorldApp.csproj.CoreCompileInputs.cache
│ MyHelloWorldApp.csproj.FileListAbsolute.txt
│ MyHelloWorldApp.dll
│ MyHelloWorldApp.GeneratedMSBuildEditorConfig.editorconfig
│ MyHelloWorldApp.genruntimeconfig.cache
│ MyHelloWorldApp.GlobalUsings.g.cs
│ MyHelloWorldApp.pdb
│ PublishOutputs.805c2eaa13.txt
│
├─ref
│ MyHelloWorldApp.dll
│
├─refint
│ MyHelloWorldApp.dll
│
└─win-x64
│ .NETCoreApp,Version=v8.0.AssemblyAttributes.cs
│ MyHelloW.65ACC690.Up2Date
│ MyHelloWorldApp.AssemblyInfo.cs
│ MyHelloWorldApp.AssemblyInfoInputs.cache
│ MyHelloWorldApp.assets.cache
│ MyHelloWorldApp.csproj.CoreCompileInputs.cache
│ MyHelloWorldApp.csproj.FileListAbsolute.txt
│ MyHelloWorldApp.deps.json
│ MyHelloWorldApp.dll
│ MyHelloWorldApp.genbundle.cache
│ MyHelloWorldApp.GeneratedMSBuildEditorConfig.editorconfig
│ MyHelloWorldApp.genpublishdeps.cache
│ MyHelloWorldApp.genruntimeconfig.cache
│ MyHelloWorldApp.GlobalUsings.g.cs
│ MyHelloWorldApp.pdb
│ PublishOutputs.abaced9b7c.txt
│ singlefilehost.exe
│
├─ref
│ MyHelloWorldApp.dll
│
└─refint
MyHelloWorldApp.dll
MyHelloWorldApp\bin\Release\net8.0\win-x64\publish\MyHelloWorldApp.exe
これだけを配布して、ダブルクリックで実行可能。
コメント