C#インタラクティブ:Dev Basics/Keyword
C#インタラクティブを使うと、Visual Studioあるいはコマンドプロンプトなどで、C#コードを対話的に入力、実行できるようになる。
C#インタクティブは、C#用のREPL環境。Visual Studio(以下、VS)では[C# Interactive]ウィンドウの形で、またコマンドラインツールとしてはcsiコマンドの形で使用できる。また、CSIコマンドラインツールを使うことで、C#で記述されたスクリプトファイルを単独のプログラムとして実行することも可能だ。
[C# Interactive]ウィンドウ
VS 2015 Update 1以降では、[C# Interactive]ウィンドウがサポートされ、そこでC#コードを対話的に実行できるようになっている。これを表示するにはVSのメニューバーから[表示]−[その他のウィンドウ]−[C# インタラクティブ]を選択する。以下はVS 2017でこれを表示したところだ(本稿ではVS 2017での動作を前提としている)。
プロンプトに対して、コードを入力していくと、[Enter]キーで「入力を完了した」時点でそのコードが実行/評価され、その結果がウィンドウに表示される。次のようなHelloWorldメソッドを[C# Interactive]ウィンドウで入力してみよう。
void HelloWorld()
{
Console.WriteLine("Hello World");
}
すると、[C# Interactive]ウィンドウの表示が次のようになる。見ての通り、入力が完了していないと判断されたときには、プロンプトが「>」から「.」に変わり、後続のコードの入力が促される。
上の画像に示した通り、このようにして定義したメソッドはそのままプロンプトから呼び出すことができる。また、このウィンドウ内ではIntelliSenseも利用できるので、コードの入力も簡単に行える。
C#コードの動作をちょっと確認したいという場合でも、通常は新規にコンソールアプリプロジェクトを作成して、Mainメソッド(と必要であればメソッドなど)を定義して、デバッグ実行をして……といった手順が必要になる。これは日常的に行う「手慣れてはいるが面倒な作業」だ。これに対して、[C# Interactive]ウィンドウを使えば、とても簡単にその動作を確認できるようになる。
対話環境への指示を行うディレクティブ
なお、C#コードではなく、対話環境に対する指示は「#」を前置してコマンドを指定してやる。これをC#インタラクティブでは「ディレクティブ」と呼んでいる。[C# Interactive]ウィンドウでは次のディレクティブが提供されている。csiコマンドラインツールでは、#cls/#clear/#resetディレクティブ以外のディレクティブを使用可能だ。
ディレクティブ | 説明 |
---|---|
#cls/#clear | ウィンドウの内容をクリアする |
#help | ヘルプドキュメントを表示する |
#reset | 実行環境をリセットする |
#r "アセンブリ" | 現在の実行コンテキストにアセンブリを追加する |
#load "スクリプトファイル" | スクリプトファイルを読み込んで実行する |
[C# Interactive]ウィンドウで実行できるディレクティブ |
#cls/#clearディレクティブは、ウィンドウに表示されている内容をクリアするもので、実行コンテキストやウィンドウで入力したコードの履歴などはクリアされない。一方、#resetディレクティブは実行環境をクリアするものだ。
また、#rディレクティブは指定したアセンブリを現在の実行コンテキストに追加するものだ。例えば、System.Windows.Formsアセンブリを読み込むには「#r "System.Windows.Forms"」ディレクティブを実行すればよい。以下はこのアセンブリを読み込み、[C# Interactive]ウィンドウからWindowsフォームを作成、表示しているところだ。
なお、最初に示した画像をよく見ると「'CSharpInteractive.rsp' からコンテキストを読み込んでいます」というメッセージがあるのが分かる。このファイルで初期に読み込まれるアセンブリと名前空間定義の指定が行われている。実際のファイルの内容は次のようになっている。
/r:System
/r:System.Core
/r:Microsoft.CSharp
/r:System.ValueTuple.dll
/u:System
/u:System.IO
/u:System.Collections.Generic
/u:System.Console
/u:System.Diagnostics
/u:System.Dynamic
/u:System.Linq
/u:System.Linq.Expressions
/u:System.Text
/u:System.Threading.Tasks
「/r:」で始まる行が読み込むアセンブリを、「/u:」で始まる行が名前空間定義を表している。よって、デフォルトではSystem/System.Core/Microsoft.CSharp/System.ValueTuple.dllの各アセンブリが読み込まれるようになっているということだ。また、System/System.IOなど、おなじみの名前空間も初期状態から利用できるようになっていることも分かる。
#loadディレクティブは、C#で書かれたスクリプトファイルを読み込んで、実行するためのものだ。例えば、次のワンライナーを「c:\project\devbasics\csx\hello.csx」ファイルに保存したとする(C#スクリプトファイルの拡張子は「.csx」とするのが一般的)。
Console.WriteLine("Hello World");
このファイルを読み込んで実行しているところを以下に示す。
なお、#helpディレクティブを実行すると、ヘルプドキュメントが表示される。このドキュメントにはここまでに見てきたディレクティブの他に、キーボードショートカットについても述べられているので、必要に応じて参照しよう。
csiコマンド
csiコマンドラインツールを実行するには、開発者用のコマンドプロンプト(例えば、[Developer Command Prompt for VS 2017]など)から「csi」コマンドを入力する(あるいはcsiコマンドがあるディレクトリを環境変数PATHに含めてもよい)。
[C# Interactive]ウィンドウとの違いとしては、IntelliSenseが使えない、幾つかのキーボードショートカットが使えない、#cls/#clear/#resetディレクティブがない、[Ctrl]+[C]キーで対話環境を終了するといったところだ。VSを起動していない状態で、動作を確認したいといったときにはこちらの方が軽量だが、IntelliSenseが使えないので使い勝手がよいとはいえない。どちらかといえば、C#スクリプトファイルの実行環境と考えた方がよいだろう。
csiコマンドにスクリプトファイルを与えると、それが実行される。以下は先ほど作成したhello.csxファイルを実行しているところだ。
C:\project\devbasics\csx>csi hello.csx
Hello World
また、csiコマンドのオプションとしては次のようなものがある(一部)。
オプション | 説明 |
---|---|
/help | ヘルプドキュメントを表示する |
/version | バージョン情報を表示する |
/i スクリプトファイル | 指定したスクリプトファイルを実行した後に対話環境に移行する |
/r:アセンブリ | 指定したアセンブリを読み込む |
/u:名前空間 | 名前空間のusing宣言を行う |
csiコマンドのオプション |
「/r:」オプションと「/u:」オプションは上で見たCSharpInteractive.rspファイルへの記述と同様な形式で読み込むアセンブリ、名前空間の定義を行うものだ(ただし、C#スクリプトファイルの先頭でも「#r "……"」として使用するアセンブリを指定できるので、コマンドラインで煩雑な指定をするよりはスクリプトファイルでアセンブリを読み込むようにするのが簡単だろう)。また、csiコマンドでデフォルトで読み込まれるアセンブリや名前空間定義についてはcsiコマンドと同じディレクトリにあるcsi.rspファイルで記述されている(.rspファイルの内容を調べる場合は、WindowsエクスプローラーからVSのインストールディレクトリでそれらのファイル名を検索してやるのが簡単だ)。
C#インタラクティブを使うと、VSあるいはコマンドプロンプトなどで、C#コードを対話的に入力、実行できるようになる。ちょっとした動作確認のためだけに、コンソールアプリプロジェクトを新規に開始して、Mainメソッドなどを記述して、デバッグ実行をして……といった面倒な作業をする必要がなくなるので、VSで作業をしているときには常に[C# Interactive]ウィンドウを表示しておくと日々の作業がはかどるはずだ。また、csiコマンドラインツールを使うと、C#で記述したスクリプトをコマンドラインから単独のプログラムとして実行できるので、手慣れた言語でちょっとした処理を行いたいという場合には便利に使えるだろう。
参考資料
- csi.exeコマンド登場! C#スクリプト(.csx)やREPLを動かそう: C#インタラクティブのより詳しい解説記事(ただし、2015年の記事なので、CSharpInteractive.rspファイルが保存されているディレクトリなどに違いがあるかもしれない)
- Essential .NET - C# スクリプト: MSDNマガジンで提供されているVS 2015ベースのC#インタラクティブの解説記事
Copyright© Digital Advantage Corp. All Rights Reserved.