C#による.NET Core入門(3)

C#による.NET Core入門(3)

.NET Coreでプロジェクトを作成して開発してみよう

2017年9月5日

クロスプラットフォームで開発できる.NET Coreの基礎から開発実践までが学べる入門連載。3回目は実際にプロジェクトを新規に作成して、Visual Studio Codeを使って開発するフローを説明する。

レッドハット株式会社 田中 孝佳
  • このエントリーをはてなブックマークに追加

.NET Core 2.0リリース

.NET Core 2.0 リリース

 8月14日(日本時間では15日未明)、.NET Core 2.0がリリースされた。.NET Core SDK 2.0がダウンロード可能となり、.NET Core 2.0, ASP.NET Core 2.0, Entity Framework Core 2.0 にバージョンアップしたNuGetライブラリが利用可能になっている。

 今後の本連載に関してだが、.NET Core 2.0を前提に説明をしていく予定だ。本連載で説明する多くの部分は基本的な操作であるため、.NET Core 1.0や1.1でも同様の手順で利用できると思われるが、ぜひ本連載を見て.NET Coreを今から始める方は最新版で試していただきたい。2.0になって特に操作が変わった点については適宜説明をしていく。

.NET Core 2.0 のインストール

 .NET Core SDK 2.0のインストールは引き続きダウンロードページの下の方にある「Step-by-step instructions」(英語)を参照してインストールしてほしい。もしpreviewバージョンをインストールしていた場合は、あらかじめアンインストールもしくはディレクトリごと削除しておいてほしい。

 .NET Core SDK 1.xとの共存は可能であるが、その場合は環境変数PATHに設定しているディレクトリに存在するdotnet実行ファイルは2.0のものだけを含めるようにする必要がある。不安な場合は、.NET Core SDK 2.0をインストールする前に、以前のバージョンをアンインストールするか、PATH環境変数が示すディレクトリから削除するようにしてほしい。例えばCentOSの場合であれば、/usr/loca/bin/dotnetのリンクを削除すればPATH環境変数から削除でき、/usr/dotnet以下のディレクトリを削除すればアンインストールできる。

 インストール時に圧縮ファイルを展開する方式を採るCentOSやDebian、さらには2.0でサポートされ同様のインストール方式であるFedoraやSUSEでは、1.0や1.1で利用していた/usr/dotnetというroot権限が必要なディレクトリではなく、~/dotnetといったユーザー権限でアクセス可能なディレクトリにインストールするように指示がされているので展開先には注意してほしい。

プロジェクトの作成と実行

 さっそくプロジェクトを作成してみよう。Windows上でVisual Studioを使う場合は、Visual Studioのプロジェクト作成機能が便利だが、.NET Core CLIでプロジェクトを作成することもできる。ターミナル(Windowsの場合はコマンドプロンプトもしくはPowerShellコンソール)を開き、dotnet newと実行してみよう。

図1 dotnet newコマンドの出力結果

 以前のバージョンとは挙動が変わり、オプションをつけずにdotnet newコマンドだけだとコマンドの説明が表示されるようになった。プロジェクトだけではなくさまざまなファイルも作成でき、まとめてテンプレートと呼んでいる。独自のテンプレートを追加することもできる。

 今回は新規にConsole ApplicationをC#言語でプロジェクト作成してみよう。

shell
$ dotnet new console -n Example03 -o Example 
リスト1 Example03というプロジェクト名で、カレントディレクトリにExampleというディレクトリを作成し、そこにConsole Applicationプロジェクトを作成するコマンド
図2 dotnet new consoleコマンドの出力結果

 ここで作成されたプロジェクトの中身(<プロジェクト名>.csprojファイルとProgram.csファイル)を確認してみよう(リスト2)。バージョンにより多少異なる可能性はあるが、基本的には変わらないはずである。

Example03.csproj
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.0</TargetFramework>
  </PropertyGroup>
</Project>
リスト2 dotnet new consoleコマンドで出力された<プロジェクト名>.csprojファイルの中身

 <プロジェクト名>.csprojファイルは.NET FrameworkのころからあったXML形式のプロジェクトファイルである。似たような形式ではあるが、簡略化されたフォーマットになっている。

 <Project>要素のSdk属性に指定したタイプのプロジェクト設定を参照している。
  <PropertyGroup>要素の子要素にプロジェクトの設定を指定する。
   <OutputType>Exeを指定することで、そのプロジェクトが起動可能なアプリケーションであることを示している。
   <TargetFramework>はそのアプリケーションが動作する.NET CoreのFrameworkバージョンを指定している。

 これらについては次回以降テストプロジェクトやクラスライブラリプロジェクトという種類のプロジェクトを作成する際に説明する予定である。

Program.cs
using System;

namespace Example03
{
  class Program
  {
    static void Main(string[] args)
    {
      Console.WriteLine("Hello World!");
    }
  }
}
リスト3 dotnet new consoleコマンドで出力されたProgram.csファイルの中身

 Program.csファイル(リスト3)は、エントリポイントとなるC#のソースコードファイルである。static voidstring[]を引数(=中身はコマンドライン引数)にとるMainメソッドが、最初に実行されるエントリポイントとなる。テンプレートプロジェクトではHello World!とコンソールに表示して終了するプログラムとなっている。エントリポイントとなる形式はこれ以外にもあるので、興味のある方は「C# 基礎文法 最速再入門【7.0対応】」を参照してほしい。

 それでは実行してみよう。.NET Core 1.1以前ではdotnet restoreコマンドが事前に必要だったが、.NET Core 2.0以降では図2の最後に表示されているように暗黙的にrestoreが実行されている。このように必要に応じてrestoreが実行されるのが.NET Core 2.0の新機能である。もちろんdotnet restoreコマンドを明示的に実行することもできる。

 それでは.csprojファイルが配置されているディレクトリに移動し、dotnet runコマンドでプロジェクトを実行しよう(図3)。

図3 dotnet runコマンドの出力結果
図3 dotnet runコマンドの出力結果

 ここで、dotnet runコマンドでプログラムが実行されるまでを簡単に説明しよう。大きく分けて、restore(リストア)・build(ビルド)・run(実行)という3つの処理を行っている。

 restore処理では、プログラムの実行に必要なライブラリのダウンロードと配置を行っている。.NET Core SDKインストール時にローカルにインストールされているライブラリはファイルコピーを行い、インターネットから(設定によりイントラネットやファイルシステムから)追加で必要な外部ライブラリをダウンロードし配置している。インターネットで公開されているライブラリを追加する方法は最後の節で説明する。

 restore処理が完了した後、プロジェクトのbuildが実行される。.csprojファイルに記述されている内容と、runコマンドに渡したオプションを基にソースコードがビルドされて.dllファイルとして配置される。

 最後に、配置された.dllファイルをdotnetコマンドでrunすることでプログラムが実行される。

 なお、dotnet runコマンドはデフォルトでカレントディレクトリのプロジェクトファイルを参照してビルドする。また、--projectオプションでプロジェクトファイルを指定することもできる。このとき、dotnet runコマンドによるプログラムの実行は、高速化のため、ライブラリをキャッシュして利用することがある。そのため運用環境でのdotnet runコマンドでのアプリの実行は推奨されない。次回の記事で運用環境向けのバイナリの作成と実行方法を説明する。

ソリューションの操作

 Visual Studio同様、複数のプロジェクトをまとめて管理するソリューションという概念も.NET Core CLIで扱うことができる。.NET Core CLIを使って先ほどのプロジェクトファイルの1つ上の階層のディレクトリにソリューションファイルを作成し、プロジェクトをソリューションに追加してみよう。

 ソリューションファイルもdotnet newコマンドのテンプレートとして提供されている。dotnet new slnコマンドでソリューションファイルを追加する。

図4 dotnet new slnコマンドの出力結果
図4 dotnet new slnコマンドの出力結果

 図4はコマンド実行時のを出力結果だ。これにより<同階層のディレクトリ名>.slnファイルが追加される。

 次に、このソリューションに先ほど作成したプロジェクトを追加してみよう。ソリューションに対するプロジェクトの追加や削除などの操作はdotnet slnコマンドで行える。

図5 dotnet new slnコマンドの出力結果

 ソリューションは関連性の強い複数のプロジェクトをまとめて管理するときに有用だ。1つのプロジェクトが別のプロジェクトを参照することもできるが、次回以降に説明を行う予定だ。

Visual Studio Codeでの開発とデバッグ

 ここまで、プロジェクトとソリューションの基本的な操作をターミナルで行った。次に、プロジェクトをVisual Studio Codeで開いて、コードの編集とデバッグを行ってみよう。Visual Studio Codeは連載1回目の記事を基にインストールおよびC#拡張のインストールをしているものとする。

 まずはプロジェクトのディレクトリをVisual Studio Codeで開く。ターミナルでcode <プロジェクトのディレクトリパス>と実行するとVisual Studio Codeが該当のディレクトリを開いて起動する。また、Visual Studio Codeを起動しておいて、(メニューバーの)[ファイル]-[フォルダーを開く]メニューでプロジェクトのディレクトリを指定することもできる。

 プロジェクトのディレクトリをC#拡張の入ったVisual Studio Codeで開くと、アセットの追加とNuGetライブラリのrestoreを行うかどうかの確認メッセージが表示されることがある(図6)。restoreに関してはすでに実行済みの場合は表示されない。両方ともOKをクリックしてダウンロードを許可しよう。

図6 プロジェクトをVisual Studio Codeで開いて、アセットの追加とNuGetライブラリのrestoreの確認ダイアログが表示されたところ

 アセットはプロジェクトのディレクトリに.vscodeというディレクトリが作成され、その中に.jsonファイルとして作成される(図7)。

図7 アセットファイルが.vscodeディレクトリ内に作成されている様子
図7 アセットファイルが.vscodeディレクトリ内に作成されている様子

 さて、試しに適当にコーディングをしてみてほしい。例えばリスト2のコードをコピー&ペーストではなく、Mainメソッドの中に手で入力してみてほしい。

C#
static void Main(string[] args)
{
  var text = "abc".Remove(1);
  Console.WriteLine(text);
  Console.WriteLine("Hello World!");
}
リスト4 サンプルコード1

 入力途中で図8のようにIntelliSenseが表示されるはずだ。IntelliSenseは、文字列入力のみである程度は表示されるが、明示的に表示したい場合は、Ctrlスペースキーで表示できる。

図8 IntelliSenseが表示されている様子

 リスト4のコードが入力できたら実行してみよう。左側のデバッグ(虫の上に禁止マーク)アイコンをクリックし、左のペインの上にある緑色の三角矢印でデバッグ開始できる(図9)。ショートカットキーはF5だ。Visual Studio Code上ではコンソール入出力は[デバッグ コンソール]というウィンドウで扱われる。

図9 デバッグ実行した結果

 このようにデバッグ起動が完了した。

 また、ブレークポイントを貼ることもできる。図10のようにソースコードエディター上の行番号の左のスペースをクリックすると赤い丸が表示され、プログラムがここに到達すると一時的に停止されるようになる。赤い丸が表示されている状態で再度デバッグ実行を開始してみよう。

図10 デバッグ実行中にブレークポイントで一時停止した様子

 図10のようにプログラムの実行が一時停止し、ローカル変数の値や呼び出し階層が左側のペインで確認できるようになった。このようなグラフィカルなデバッグ機能に関しても、Visual Studio CodeはVisual Studioに近い感覚で利用できるようになっている。

NuGetからのライブラリの追加

NuGetとは

 文字列操作やリストやコレクション、ファイルやネットワーク通信といった処理に関しては、.NET Core SDKの中のCoreFXという基本クラスライブラリが提供している。しかし、それ以外のライブラリを利用した処理を書きたい場合は、そのライブラリをプロジェクトに参照として追加する必要がある。

 参照として追加する場合、開発しているプロジェクトが対象とする.NETのフレームワークに応じて、適したクラスライブラリを参照する必要がある。例えば、.NET Framework 4.5にのみ存在し.NET Core 2.0に存在しないクラスを利用しているライブラリは、.NET Core 2.0のプロジェクトから参照してもうまく動かない。そのようなフレームワークごとの対応関係をうまく処理しつつ、インターネット上に第三者が提供しているライブラリをまとめてホスティングする仕組みとして、NuGetというエコシステムが提供されている。

 .NET Core SDKではデフォルトで、nuget.orgというサイトでホスティングされているライブラリを検索するようになっており、例えばASP.NET Coreのプロジェクトを作成する場合は、マイクロソフトがnuget.orgで提供しているライブラリを追加で参照することになる。またアカウント登録すれば、誰でもnuget.orgにライブラリを登録し、任意の人に使ってもらえるようになる。さらに、社内や特定の開発者のみに公開したいライブラリを、イントラネットで提供したり、認証付きで提供したりすることも可能である。

 今回はnuget.orgからライブラリを追加する方法を説明し、次回以降でnuget.orgへのライブラリの追加を紹介する予定である。

nuget.orgからのライブラリの追加

 今回はASP.NET Coreでも参照されていて、.NETでJSONを扱うライブラリとして知名度も高いJson.NETを参照に追加してみよう。nuget.orgのトップページで「Newtonsoft.Json」や「Json.NET」、あるいは単に「json」で検索すると、比較的最初の方に表示されるはずである。

 ページを開くと図11のような画面が表示されるはずだ。ライブラリを追加するためのNuGet Package Manager用のコマンドラインが表示されているので、[.NET CLI]タブをクリックして.NET CLI用のコマンドライン表示しよう。

図11 nuget.orgのJson.NETライブラリの画面

 ライブラリを追加するには表示されたコマンド(リスト5)を、追加したいプロジェクトがカレントディレクトリの状態で実行する。もしくは、表示されたコマンドの--package-directoryオプションを付加して、そこで追加したいプロジェクトのディレクトリを指定する。なお、図11に表示されているバージョン10.0.3は執筆時点の最新版であるが、より新しいバージョンが公開されている場合は新しいバージョンを指定してもサンプルコードの実行には問題ない。

$ dotnet add package Newtonsoft.Json --version 10.0.3

 ライブラリの追加は.csprojファイルの編集で行える。リスト5のコードを実行すると、.csprojにリスト6のように<PackageReference>というXML要素が追加されているはずである。

 なお、リスト5のコードを実行せずに直接.csprojファイルにリスト6の要素を追加してもライブラリの追加は行える。その場合、dotnet restoreコマンドを実行してほしい。

XML
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.0</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Newtonsoft.Json" Version="10.0.3"/>
  </ItemGroup>
</Project>
リスト6 リスト5の結果: .csprojファイルに追加された様子

 追加できたら、Mainメソッドの中身を次のように修正してみよう。リスト7にはProgram.csファイル全体を載せているが、まずMainメソッドの中身の追加部分を手入力し、JsonConvertまで入力したところで、図11のようにIntelliSenseを表示するとusingの追加が候補として表示される。usingは指定した名前空間に属するクラスを、名前空間を省略して記述できるようにする文法である。また、new{key1=text}という記述はkey1という名前のプロパティを持つ匿名オブジェクトを生成している。このコードは匿名オブジェクトをJSON形式の文字列に変換するコードを記述していることになる。

C#
using System;
using Newtonsoft.Json;

namespace Example03
{
  class Program
  {
    static void Main(string[] args)
    {
      var text = "abc".Remove(1);
      Console.WriteLine(text);
      var jsonText = JsonConvert.SerializeObject(new { key1 = text });
      Console.WriteLine(jsonText);
      Console.WriteLine("Hello World!");
    }
  }
}
リスト7 サンプルコード2

 ここまで記述できたら、再度デバッグ実行してみよう。JSONフォーマットの文字列が[デバッグ コンソール]に出力されるはずである(図12)。

図12 リスト7のサンプルコードをデバッグ実行した結果: ソースコード11行目のコンソール出力が画面内に表示されていないのは、12行目でライブラリのロードが発生したことから、オレンジ色のメッセージが表示されスクロールされてしまったためである

 今回はコンソールアプリプロジェクトを新規に作成し、Visual Studio Codeで編集、デバッグし、nuget.orgからライブラリを追加するという流れを説明した。

 次回は今回作成したアプリを配置できる形式にビルドし、実際に配置して実行する流れを説明する。また、.NET CoreがWindows以外でも動く特徴を生かすため、Linuxマシン上に配置し、systemdから実行する方法や、cronからスケジュール実行する方法についても簡単に説明する予定である。

1. .NET Coreとは? 開発環境(SDKとVisual Studio Code)のインストール

クロスプラットフォームで開発できる.NET Coreの基礎から開発実践までが学べる入門連載スタート。初回は.NET Coreの歴史/立ち位置/特徴を紹介し、開発環境の準備方法を説明する。

2. レッドハット版.NET Coreとマイクロソフト版.NET Coreの違い

.NET CoreのMicrosoft提供版とRed Hat提供版には違いがある。Red Hat Enterprise Linux上でのNET Core環境の構築方法を紹介したうえで、.NET Core 1.xと2.x以降での違いを示す。さらにOpenShiftでの.NET Coreの利用についても言及する。

3. 【現在、表示中】≫ .NET Coreでプロジェクトを作成して開発してみよう

クロスプラットフォームで開発できる.NET Coreの基礎から開発実践までが学べる入門連載。3回目は実際にプロジェクトを新規に作成して、Visual Studio Codeを使って開発するフローを説明する。

サイトからのお知らせ

Twitterでつぶやこう!


Build Insider賛同企業・団体

Build Insiderは、以下の企業・団体の支援を受けて活動しています(募集概要)。

ゴールドレベル

  • グレープシティ株式会社
  • 日本マイクロソフト株式会社