コマンドラインでC#プログラミング

#はじめに
C#でプログラミングをする場合、Visual Studioは非常に便利で強力な開発ツールです。しかしながら、例えば、ネット上のコードスニペットをちょっと実行してみたいときとか、ちょっとした処理をさせるための数行のアプリケーションを作成したいとき、Visual Studioはちょっと重いですし、Visual Studioが使えない環境での開発もあります。
そんなとき、コマンドラインからプロジェクトの作成やコンパイル、実行ができればとても便利です。


#環境
- Windows 10 Pro　バージョン1809
- .NET SDKインストール済み

##.NET SDKのインストール
Visual Studioで.NET開発のワークロードをインストール済みであれば.NET Coreや.NET Frameworkの開発環境がすでにインストールされていると思います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/245438/d3a0dcba-d219-9beb-db64-2411a8f6a77b.png)

開発環境がインストールされているかどうかは、コマンドラインから以下のように確認できます。
バージョン番号が表示されればOKです。

```
> dotnet --version
2.1.403
```

`dotnet`なんてコマンドは無いよ、って言われた場合はVisual Studioをインストールするか、.NET SDKをインストールしましょう。
Microsoftの[こちらのページ](https://www.microsoft.com/net/learn/dotnet/hello-world-tutorial)はコマンドラインからプログラミングをするチュートリアルになっていて、.NET SDKのインストールから実行までの手順が書いてあります。
書いてあるのですが、解説を続けます。

#プロジェクトを作ろう
`dotnet new`コマンドでプロジェクトを作成します。プロジェクトを作成するとき、プロジェクトのフォルダを作ってそのフォルダ内で`dotnet new プロジェクトテンプレート`とするか、

```
> cd TestApp
> dotnet new console
```

または`dotnet new プロジェクトテンプレート -o プロジェクト名`として、プロジェクト作成時にフォルダを指定するかです。

```
> dotnet new console -o TestApp
```

先のチュートリアルでは後者の方法ですね。どちらでも良いです。
プロジェクトフォルダの中に、このようなファイルやフォルダが生成されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245438/3441a131-b5fd-94e2-3c45-4d0372cc9f84.png)

#プロジェクトテンプレート
上の例ではコンソールアプリケーションのテンプレートを指定しています。
Visual Studioでアプリケーションを作るときは「WPFアプリケーション」や「コンソールアプリケーション」、「ASP.NET Core」など作成したいアプリケーションの種類に応じてテンプレートを選択しましたが、それを文字で指定しています。
他にどのような種類があって、指定するための文字列は何でしょうか。

##テンプレートの種類と指定に使う文字列表現
以下のコマンドを入力すると、テンプレートの一覧を見ることができます。

```
> dotnet new -h
```

```
テンプレート                                            短い名前               言語                タグ
----------------------------------------------------------------------------------------------------------------------------
Console Application                               console            [C#], F#, VB      Common/Console
Class library                                     classlib           [C#], F#, VB      Common/Library
Unit Test Project                                 mstest             [C#], F#, VB      Test/MSTest
NUnit 3 Test Project                              nunit              [C#], F#, VB      Test/NUnit
NUnit 3 Test Item                                 nunit-test         [C#], F#, VB      Test/NUnit
xUnit Test Project                                xunit              [C#], F#, VB      Test/xUnit
Razor Page                                        page               [C#]              Web/ASP.NET
MVC ViewImports                                   viewimports        [C#]              Web/ASP.NET
MVC ViewStart                                     viewstart          [C#]              Web/ASP.NET
ASP.NET Core Empty                                web                [C#], F#          Web/Empty
ASP.NET Core Web App (Model-View-Controller)      mvc                [C#], F#          Web/MVC
ASP.NET Core Web App                              razor              [C#]              Web/MVC/Razor Pages
ASP.NET Core with Angular                         angular            [C#]              Web/MVC/SPA
ASP.NET Core with React.js                        react              [C#]              Web/MVC/SPA
ASP.NET Core with React.js and Redux              reactredux         [C#]              Web/MVC/SPA
Razor Class Library                               razorclasslib      [C#]              Web/Razor/Library/Razor Class Library
ASP.NET Core Web API                              webapi             [C#], F#          Web/WebAPI
global.json file                                  globaljson                           Config
NuGet Config                                      nugetconfig                          Config
Web Config                                        webconfig                            Config
Solution File                                     sln                                  Solution

```

このリストの2列目の「短い名前」というのが、テンプレートを指定するときに使う名前になっています。
試しに「ASP.NET Core Web App(Model-View-Controller」のプロジェクトを作成してみましょう。テンプレート名は「mvc」ですね。

```
> dotnet new mvc -o TestMVC
```

プロジェクトの生成が完了したら`TestMVC`フォルダに移動して、ファイルやフォルダが作成されていることを確認してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245438/9252abac-0bac-2060-eb05-a466adb8066c.png)

#実行しよう
プロジェクトを実行するにはシンプルに以下のコマンドを使います。
プロジェクトのビルドが行われ、実行されます。

```
> dotnet run
```
コマンドラインに`Hello World!`と表示されるはずです。

##ビルドのみはこちら
ビルドのみは`dotnet build`です。

```
> dotnet build
```

#プログラミング
プログラミングは好きなテキストエディタを使いましょう。メモ帳だってかまいませんが、Visual Studio Codeなどの高機能なテキストエディタのほうがプログラミングしやすいと思います。

さしあたり、プロジェクトフォルダ内の`Program.cs`を開きましょう。
メモ帳：
<img src='https://qiita-image-store.s3.amazonaws.com/0/245438/532979aa-693e-5462-ca85-88bd80a86638.png' width='40%'>
Visual Studio Code：
<img src='https://qiita-image-store.s3.amazonaws.com/0/245438/7195c3c4-3f4c-6e0d-af87-4b0667d0c2ba.png' width='40%'>

Visual Studio Codeのほうがハイライトされて見やすいのでおすすめです。
というようにお好きなテキストエディタでプログラムを編集して、保存したのちに前述の方法で実行すれば良いです。

追記(2018.10.18)：
Visual Studio Codeを使うと便利と書きましたが、拡張機能を入れることによって開発がさらに便利になります。書くだけではなく、ソースコードの整形やブレークポイントを使ったデバッグなどについては[こちら](https://qiita.com/shuhey/items/38ce475b3c0c90862d2c)。

#.NET Coreアプリはわかった。だが.NET Frameworkアプリはどうだ？

Windowsであれば、.NET Frameworkを使うこともできます。
その場合、プロジェクト生成の際にフレームワーク指定してやります。

```
> dotnet new console --target-framework-override フレームワーク名
```
フレームワーク名は[こちら](https://docs.microsoft.com/ja-jp/dotnet/standard/frameworks)にあるように、種類、バージョンごとに指定に用いる文字列が決まっています。
例えば「.NET Framework 4.6.0」を使いたいのであれば、「net46」をフレームワーク名として使用します。

```
> dotnet new console --target-framework-override net46 -o TestApp4
```
こうして作られたプロジェクトは.NET Framework 4.6.0で使えるAPIを使ってプログラムを作成することができます。
左は.NET Coreで、右が.NET Framework 4.6.0です。

`System.Drawing.Image`クラスは.NET Coreには含まれていないため、コンパイルエラーになりますが、.NET Framework 4.6.0を使っているほうはコンパイルがとおります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/245438/8a1501a1-35e1-a1e8-df5a-3dd61468ad09.png)


#おわりに
長くなってしまいましたが、コマンドラインから.NETアプリケーションを開発する手順です。
ちょっとコードを動かしてみたいなどの使い方はもちろんのこと、Visual Studio Codeなどの高機能エディタを活用することでそれなりのボリュームのアプリケーションを開発することも可能です。