VisualStudioCode + C# で .NET6のコンソールアプリを作成する
.NET6のコンソールアプリ を ChromeBook にインストールしたVisualStudioCode(以下VSCode)を使って、C#で作成していきます。
定形作業をバッチ化していく場合、WindowsならDOSコマンドやPowerShell、Linuxならばbashなどのshellでといった具合に言語を使い分けたりする必要もあったりしますが、.NET6であればランタイムがインストールされている任意のプラットフォームで実行するアプリを、C#だけでつくることができます。
この記事では VisualStudioCode + C# で、フレームワークとしてCysharp/ConsoleAppFramework
を使って、キーボードからYes/Noの入力待ちを受け付けるところまでを作成していきます。
この記事の前提条件
- ChromeBook で開発する
- ChromeBook には VSCode がインストールされている
- フレームワークとして
Cysharp/ConsoleAppFramework
を使用する
ChromeBook への VSCode のインストールは、次の記事を参考にしてください。
.NET SDKをインストールする
.NET アプリの開発には SDK が必要なので、公式の手順でChromeBookに.NET SDKをインストールします。
記事を書いている時点では、私のChromeBookはDebian11だったので、公式のDebian11の手順でリポジトリとSDKをインストールしました。
- パッケージリポジトリを追加する
wget https://packages.microsoft.com/config/debian/11/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb
- SDKをインストールする
sudo apt-get update && \
sudo apt-get install -y dotnet-sdk-6.0
- インストールされたことを確認する
dotnet --list-sdks
次のように表示されます
6.0.401 [/usr/share/dotnet/sdk]
VSCodeにプラグインをインストールする
次の記事を参考させてもらい、C#の開発に必要なプラグイン、あると便利なプラグインをインストールしていきます。
今回は以下のものをインストールしました。
- C#
- VS Sharper for C#
- Auto-Using for C#
- .NET Core Test Explorer
- Bookmarks
- NuGet Package Manager
- NuGet Reverse Package Search
- NuGet Gallery
dotnetコマンドでテンプレートからコンソールアプリを作成
ひとまずテンプレートから、作成するアプリの雛形をつくります。
dotnetコマンドを使って、公式の手順でテンプレートから開発のベースとなるコンソールアプリを作成します。
ターミナルを開き、作業用のディレクトリで以下のコマンドを実行します。
dotnet new console -o "SampleConsole"
code SampleConsole
実行すると VSCode が起動して、右下あたりにメッセージが表示され、ビルドやデバッグに必要なファイルの追加を促されますのでYes
を選択します。
これにより F5に相当するキー(「虫眼鏡キー+数字の5かデスク切り替えキー」や「Windowsキー+F5」)で ビルドと実行ができるようになります。
実行すると デバッグコンソールにHello wolrd
が表示されます。
リリースビルドをつくる
IDEとして Visual Studio を使ってるのならばメニューからリストで選んでリリースビルドを作ることもできますが、VSCodeの場合 tasks.json を編集したりする必要があるので、ひとまず公式の内容を参考にして dotnetコマンドでリリースビルドをつくってみます。
- VSCodeで 表示→ターミナル
- dotnetコマンドでリリースビルドを実行
dotnet publish --configuration Release
プロジェクトフォルダのbin/Release/net6.0/publish
に実行に必要なファイルが出力されます。
SampleConsoleアプリを作成した場合、dotnet SampleConsole.dll
で、.NET ランタイムがインストールされている任意のプラットフォームで実行させることができます。
出力されるファイルについては、公式のドキュメントを読んでください。
ConsoleAppFrameworkのインストール
コンソールアプリ作成のためのnugetパッケージとしてCysharp/ConsoleAppFrameworkをインストールします。
インストールしていたNuGet Gallery
でインストールしていきます。
- 表示→コマンドパレット
-
nuget
と入力し、Open Nuget Gallery を選択 - ConsoleAppFrameworkを検索してインストール
コンソールアプリの編集
公式のドキュメントを参考にConsoleAppFramework
を使ってアプリを編集していきます。
ConsoleAppFramework
ではクラスのPublicメソッドをコマンドとして登録できるのでConsoleAppBase
を継承したクラスを作成し、コマンドを追加していきます。
また[RootCommand]
属性を持つメソッドをデフォルトのコマンドとして登録できます。
var app = ConsoleApp.Create(args);
app.AddCommands<Foo>();
app.Run();
public class Foo : ConsoleAppBase
{
[RootCommand]
public void Hello()
{
Console.WriteLine("Hello, World!");
}
public void Sum([Option(0)]int x, [Option(1)]int y)
{
Console.WriteLine((x + y).ToString());
}
}
VSCodeからF5でデバッグ実行、あるいはdotnetコマンドでdotnet SampleConsole.dll
のように実行するとデフォルトコマンドのHello
が実行され、デバッグコンソールにHello wolrd
が表示されます。
Sum
コマンドを実行するには、パラメータとしてサブコマンドの名前を渡して実行します。
dotnet SampleConsole.dll sum 1 3
4
Yes/Noの入力待ちの受付
ここでは[RootCommand]
をYesOrNo
メソッドとし、キーボードからYes/Noの入力待ちを受け付ける処理を作成します。
キーボードのY
キーが押されたら処理開始のメッセージを、N
キーが押されたら処理終了のメッセージを、それ以外のキー入力は無視するようにします。デフォルトをN
キーとし、エンターのみ押された場合はN
キーと同様の処理をします。
また、エスケープキーが押された場合は強制終了とし、これもN
キーと同様の処理をすることにします。ただし、エスケープキーの場合はエコーバックはおこなわないでおきます。
[RootCommand]
public void YesOrNo()
{
Console.WriteLine("処理を開始していいですか?");
Console.WriteLine(" [y,N] ");
ConsoleKeyInfo cki;
do {
while (Console.KeyAvailable == false){
Thread.Sleep(250);
}
cki = Console.ReadKey(true);
if ( (cki.Key == ConsoleKey.N) || (cki.Key == ConsoleKey.Enter) ){
Console.WriteLine("N");
Console.WriteLine("処理を終了します");
return;
} else if (cki.Key == ConsoleKey.Escape){
return;
}
} while(cki.Key != ConsoleKey.Y);
Console.WriteLine("処理を開始します");
return;
}
ユーザーから押されたキーを取得するにはConsole.ReadKey
メソッドを使います。ただし、Console.ReadKey
メソッドを呼び出すとキーが押されるまで処理をブロックしてしまうので、Console.KeyAvailable
プロパティを使ってキーが押されるまで待つ、キー待ちループを作ります。Console.KeyAvailable
プロパティは、入力をブロックせずに値をすぐに返します。
まとめ
本記事では ChromeBook にインストールした VSCode で 基本のキー入力を伴うC#のコンソールアプリを作成しました。
アウトプットを出す場合には「やり始める」というハードルを超えることが一番重要なのではないかなと思っているのですが「どうやってやるんだっけ」「どこから手をつければいいんだっけ」でつまづいて、最初のハードルを超えられずに何も始まらないということが、私の場合はよくあります。
特に定形作業を自動化するといったことは、面倒な作業を楽にしたいというところから生まれてくると思うのですが、その作業をやり始めるのが面倒であると結果的に面倒を乗り越えるための作業が面倒で、慣れた面倒な作業を面倒だけど続けてしまうということになってしまうのではないかと思います。
多くの環境で比較的簡単に動かしやすく、使い回しのきくC#で定形処理を書いていくことで最初のハードルを超えやすくなるのではないかなと思いました。
参考
- GitHub - Cysharp/ConsoleAppFramework: Micro-framework for console applications to building CLI tools/Daemon/Batch for .NET Core, C#.
- neue cc - ConsoleAppFramework - .NET Coreコンソールアプリ作成のためのマイクロフレームワーク(旧MicroBatchFramework)
- Console.ReadKey メソッド (System) | Microsoft Learn
- Console.KeyAvailable プロパティ (System) | Microsoft Learn
- ConsoleKeyInfo 構造体 (System) | Microsoft Learn
- ConsoleKey 列挙型 (System) | Microsoft Learn
Discussion