◆ 静的解析や入力サポートが VisualStudio 並み
◆ console アプリで C# だけ書くなら重い VisualStudio を起動しなくても良さそう
◆ .NET Core は C# 7.0 のタプルやローカル関数も対応してる
◆ dotnet コマンドが便利
  ◆ プロジェクト作成や実行などを VisualStudioCode の端末からできる
◆ OmniSharp がちゃんと動いてないなら .NETCore 入れた後に拡張機能を再インストールで直るかも

.NET Core

VisualStudio Code で C# を書いてみました

これまでもちょっと修正くらいならやっていたのですが 全然補完してくれないしエラーもわからないしでただのエディタレベルだと思ってたのですが ちゃんと必要なものをインストールすれば VisualStudio 並に高機能になりました

インストール順?

とりあえず 実行とデバッグをしたかったので さっそくやってみようとしたらなぜか動かないです

使い方のページを色々見て 同じように C# ファイルを開いてデバッグ実行を押してるのに反応なしです
構成のところが未選択になっていたのでこれかな っと一覧から .NET Core を選んだのですがここも反応なしです
選択したのにそれが反映すらされていません

あれこれ試しても全然ダメで特に情報も出てきません

心当たりは一応あって 最初に C# 用拡張機能の OmniSharp が自動インストールされたのですが そのときにはまだ .NET Core は未インストール状態でした
その後インストールして何度も再起動してるので 動いてるはずと思ったのですが .NET Core を読み取れてないような気もします

仕方なく OmniSharp の再インストールしたら無事動きました

高機能!

これまでとは全然違ってエラーがちゃんと表示されますし 補完もちゃんと型を判断してくれます
部分的とかでなく VisualStudio と同じように複雑なところでもちゃんと判断してくれるので コード書くときにも困りません

他にもメソッドやプロパティごとに参照カウントが表示されて参照場所を表示してくれたりすごく高機能です
using を使ってないときに Ctrl-. で探して補完してくれるなど VisualStudio と同じ便利機能を同じショートカットキーで使えるのもいいところです

実行もできるし IDE 並の補完機能があるので起動に何分もかかる VisualStudio を起動しなくていい気がしてきました
WPF とか WindowsForms みたいな GUI になると必要だと思いますが 単純に C# だけ書くなら十分すぎる機能です

特にすごいのは これだけ機能があってかなり快適なところです
Atom とか Brackets だと遅すぎてストレスを感じることはよくありましたが VisualStudioCode だとそういうのが全然ないです

dotnet

作成

プロジェクト作るところから VisualStudioCode 内で実行できます
端末を表示して
dotnet new console
を実行すると カレントディレクトリがプロジェクトフォルダとして初期化されます
new console で作ったプロジェクトは Hello World を表示するようになっています

vscodedotnet

ビルドして実行

実行は
dotnet run
です
ビルドして実行します

引数も渡せます
引数を表示するようにこのコードを追加します
Console.WriteLine(string.Join(" | ", args));
C:\Data>dotnet run --a --b c d
--a | --b | c | d
Hello World!

ビルドと実行

ビルドだけなら
dotnet build
でできます

ビルド済みを実行するなら dotnet にコマンドなしで dll を指定します
C:\Data>dotnet C:\data\test\bin\HPD\Debug\netcoreapp2.0\test.dll
Hello World!

exe にする

ビルドされるファイルは exe じゃなくて dll 形式です
.NETCore は mac など Windows 以外のプラットフォームでも動かせるからデフォルトは Windows 固有のものにしないってところでしょうか

RuntimeIdentifier を指定することで exe にできるようです

project.json をこのように修正します

<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.0</TargetFramework>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
</PropertyGroup>

</Project>

「<OutputType>Exe</OutputType>」 が最初からありますが これだけでは exe ファイルは出力されません

RuntimeIdentifier の指定は Windows 64bit は win-x64 でいいらしいです
他にも
  • win-x64
  • win7-x64
  • win10-arm
  • win81-x86
  • linux-x64
  • centos-x64
  • fedora.26-x64
  • android

などなど OS とバージョンとアーキテクチャの組み合わせが色々あります

RuntimeIdentifier を指定すると ビルド時の出力場所が変わります
RuntimeIdentifier で指定した名前のフォルダに出力されます
こっちのフォルダには exe ファイルができます

C:\DATA\TEST\BIN
└─HPD
└─Debug
└─netcoreapp2.0
│ test.deps.json
│ test.dll
│ test.pdb
│ test.runtimeconfig.dev.json
│ test.runtimeconfig.json

└─win-x64
hostfxr.dll
hostpolicy.dll
test.deps.json
test.dll
test.exe
test.pdb
test.runtimeconfig.dev.json
test.runtimeconfig.json

デバッグ

実行はできるのにデバッグはうまく動かず breakpoint で止まってくれませんでした
原因はパス指定が間違ってたことでした

デフォルトでパス指定されていたのですが HPD が抜けていたのと RuntimeIdentifier を指定したことで win-x64 が増えたことが原因でした
win-x64 の方は なくても RuntimeIdentifier を指定する前の古いバージョンがあって一応動いてしまってたので原因みつけるのがちょっと苦労しました

最終的にこういう風に設定すると breakpoint が使えました

"program": "${workspaceFolder}/bin/HPD/Debug/netcoreapp2.0/win-x64/test.dll",

nuget はパッケージはダメ?

自分で全部作ってる分には困らなかったのですが 外部パッケージを使おうとするとうまく行きませんでした
JSON を使いたかったので DynamicJSON を使おうとしたのですが インストールしても使えません

.NET CLI もコマンドが書いてあるので
dotnet add package DynamicJson --version 1.2.0
を実行しました

ログではちゃんと 「OK」 と出ていてエラーもないです
でも ライブラリは使えません

パッケージ自体はプロジェクトではなくグローバル的な nuget フォルダに保存されていました

C:\Users\namae\.nuget\packages\dynamicjson\1.2.0\Content\DynamicJson.cs

手動でプロジェクト内にコピーしてきて使えましたが .NETCore ではまだ対応できていないようですね

参考

VisualStudio Code の dotnet 設定周りは公式のドキュメントが役に立ちました
いつも MS のドキュメントって見づらい上に意味不明な日本語であんまり当てにしないのですが 新しいページになってからは見やすくて役立つのが多い気がしますね

https://docs.microsoft.com/ja-jp/dotnet/core/tutorials/with-visual-studio-code