検索しても古いバージョンの情報が混ざっていて思い通りに行かずに苦労したのでメモだ。Visual Studio 2017正式リリース直前の今の環境でRoslynを使ってコードを動的に評価させて実行させる最低限の手順だ。
手順 §
- Visual Studio 2017 RCを開く
- スタートページで「その他のプロジェクトテンプレート」を選ぶ (あるいは他の方法でプロジェクトシンク作成ダイアログを出す)
- Visual C#の下のWindowsクラシックデスクトップの下のConsole App (.NET Framework)を選ぶ
- OKを押してテンプレート作成
- ソリューションエクスプローラからプロジェクト名(ConsoleApp1等)を右クリックし、プロパティを選択
- アプリケーションタブを選択
- ターゲットフレームワークのバージョンを,NET Framework 4.6.2に変更する。
- リロードの確認ダイアログにはいを答える
- ソリューションエクスプローラからプロジェクト名(ConsoleApp1等)を右クリックし、NeGetパッケージの管理を選択
- 参照タブを選択
- 検索窓にMicrosoft.CodeAnalysis.CSharp.Scriptingを入力して検索
- Microsoft.CodeAnalysis.CSharp.Scriptingをインストール (試したときは2.0.0-rc4)
- Program.csに以下のコードを入力
- F5を押して実行
- Enterを押して終了させる
コード(Program.cs) §
using System;
using Microsoft.CodeAnalysis.CSharp.Scripting;
class Program
{
static void Main(string[] args)
{
CSharpScript.RunAsync("System.Console.WriteLine(\"Hello Roslyn\");").Wait();
Console.WriteLine("Hit Enter Key to Terminate.");
Console.ReadLine();
}
}
問題のツボ §
- Roslyn関係のNuGetパッケージやその他のソフトは多いが、REPLとしてコードを動的に評価するだけなら、必要なのはMicrosoft.CodeAnalysis.CSharp.Scripting。他は取りあえず必要になるまで忘れて良い
- フレームワークのバージョンは既定では4.5.2だがこれではMicrosoft.CodeAnalysis.CSharp.Scriptingが使えない。4.6以上に上げる
- CSharpScript.RunAsyncは非同期メソッドなので待機させることを忘れない
- "Console.WriteLine(\"Hello Roslyn\");"だと実行できない。頭にSystem.を付けてフルネームにする必要がある
感想 §
前にもやったことがあるはずなのに、やり方忘れた上に変更も多く、その上ネットを検索しても紛らわしい情報ばかりで一度は死にかけました。最初はそもそも何をnugetで取ってくれば良いかも分からずいろいろ試行錯誤しましたが、結局Microsoft.CodeAnalysis.CSharp.Scriptingだけよく、で他は依存関係として勝手に取ってきてくれました。ふう。ともかくこれでコードを書ける。