🐁

VisualStudioCode + C# で .NET6のコンソールアプリを作成する

2023/01/18に公開

.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 のインストールは、次の記事を参考にしてください。
https://zenn.dev/gatabutsu/articles/82008b901c4f04

.NET SDKをインストールする

.NET アプリの開発には SDK が必要なので、公式の手順でChromeBookに.NET SDKをインストールします。

https://learn.microsoft.com/ja-jp/dotnet/core/install/linux-debian

記事を書いている時点では、私のChromeBookはDebian11だったので、公式のDebian11の手順でリポジトリとSDKをインストールしました。

  1. パッケージリポジトリを追加する
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
  1. SDKをインストールする
sudo apt-get update && \
  sudo apt-get install -y dotnet-sdk-6.0
  1. インストールされたことを確認する
dotnet --list-sdks

次のように表示されます

6.0.401 [/usr/share/dotnet/sdk]

VSCodeにプラグインをインストールする

次の記事を参考させてもらい、C#の開発に必要なプラグイン、あると便利なプラグインをインストールしていきます。
https://zenn.dev/midoliy/articles/9e3cff958ff89ba151de

今回は以下のものをインストールしました。

  • 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コマンドを使って、公式の手順でテンプレートから開発のベースとなるコンソールアプリを作成します。

https://learn.microsoft.com/ja-jp/dotnet/core/tools/dotnet-new

ターミナルを開き、作業用のディレクトリで以下のコマンドを実行します。

dotnet new console -o "SampleConsole"
code SampleConsole

実行すると VSCode が起動して、右下あたりにメッセージが表示され、ビルドやデバッグに必要なファイルの追加を促されますのでYesを選択します。
これにより F5に相当するキー(「虫眼鏡キー+数字の5かデスク切り替えキー」や「Windowsキー+F5」)で ビルドと実行ができるようになります。

実行すると デバッグコンソールにHello wolrdが表示されます。

リリースビルドをつくる

IDEとして Visual Studio を使ってるのならばメニューからリストで選んでリリースビルドを作ることもできますが、VSCodeの場合 tasks.json を編集したりする必要があるので、ひとまず公式の内容を参考にして dotnetコマンドでリリースビルドをつくってみます。

https://learn.microsoft.com/ja-jp/dotnet/core/tutorials/publishing-with-visual-studio-code?pivots=dotnet-6-0

  1. VSCodeで 表示→ターミナル
  2. dotnetコマンドでリリースビルドを実行
dotnet publish --configuration Release

プロジェクトフォルダのbin/Release/net6.0/publishに実行に必要なファイルが出力されます。

SampleConsoleアプリを作成した場合、dotnet SampleConsole.dllで、.NET ランタイムがインストールされている任意のプラットフォームで実行させることができます。

出力されるファイルについては、公式のドキュメントを読んでください。

ConsoleAppFrameworkのインストール

コンソールアプリ作成のためのnugetパッケージとしてCysharp/ConsoleAppFrameworkをインストールします。

インストールしていたNuGet Galleryでインストールしていきます。

  1. 表示→コマンドパレット
  2. nugetと入力し、Open Nuget Gallery を選択
  3. 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#で定形処理を書いていくことで最初のハードルを超えやすくなるのではないかなと思いました。

参考

Discussion