【レポート】C#でスクリプト実行できる Roslyn for Scripting の始め方

C#

皆さん、こんにちは!
上越市を拠点にし、「FA設備・装置開発」と「画像処理」に強い会社、NSIです!
私達は豊富な経験と専門知識で、各種業界の自動化・システム化のお手伝いをしています。

さて、今回はプログラムについての記事となります。
Roslyn for Scripting」の導入方法から、実際にテストプログラムを作成して実行するところまで解説していきます。

C#でスクリプト実行してみたい!という方の参考になればと思います。
ちょっと長くなってしまいますが、どうぞお付き合いください。

スクリプトとは?

スクリプトとは、簡単に言うと ソースコードを書いてすぐ動かすことができるプログラム です。

プログラムには様々な言語がありますが、基本的に人間が理解しやすいように作られています。
そのため、プログラムを実行する際にはコンピュータが分かるように変換する作業が必要となります。
この工程をコンパイルといい、コンパイルが不要なプログラムを「スクリプト」と呼びます。

コンパイル必要なプログラムの場合(コンパイラ方式)

プログラムを作成し、一度コンパイルをした上で、処理を実行します。

コンパイル不要なプログラムの場合(インタプリタ方式)

プログラムを作成し、処理を実行します。コンパイルは実行しながら行われます。

Roslyn for Scriptingって何がすごいの?

Roslyn for Scripting(通称ロズリン)は、C#およびVB.NETのプログラム言語をサポートしています。
C#やVB.NETは「コンパイラ方式」で動作するプログラム言語です。
つまり、本来コンパイラ方式で動作するプログラム言語を、インタプリタ方式で動作する ことができます。

インタプリタ方式のメリットとして、リアルタイムでソースコードを書き替えることができる ということが挙げられます。
例えば、デバッグ中に「1+1」じゃなくて「1+2」に変更したい、という場合があったとしましょう。
コンパイラ方式だと、デバッグを終了→処理の書換え→コンパイル→再デバッグ という手順を踏まないといけません。

簡単な処理であればすぐに変更して実行できますが、複雑な処理だと、修正した部分まで到達するのに意外と手間がかかったりします。
しかし、Roslynを使うことで 処理の書換え→デバッグ続行 の2ステップで変更が完了できてしまいます。
また、動的に値を書き替えられるので、デバッグ用に修正した部分をそのままにしてしまい、思いもよらないところでバグが発生してしまう…といった事態も防ぐことができます。

Roslynを使ってみる -導入編-

それでは実際にインストールしてみましょう。
まず、Windowsフォームアプリケーション(.NET Framework)のプロジェクトを作成します。
プロジェクトを作成したら、メニューから ツール > NuGetパッケージマネージャー > ソリューションのNuGetパッケージの管理 を選択します。

NuGetの管理画面が表示されるので「Microsoft.CodeAnalysis.CSharp.Scripting」と検索します。
一番上に出てきた項目をクリックし、チェックを入れてインストールします。
正常にインストールができれば、導入は完了です。

Roslynを使ってみる -プログラム作成編-

導入が完了したので、いよいよプログラムを作成していきます。
今回は「実行」ボタンをクリック → 「処理」に記載されているスクリプトを実行 →「実行結果」にスクリプトの実行結果を表示するプログラムを作成します。

まず、以下のような画面を作成します。

「button_実行」ボタンのクリックイベントに以下の処理を記載します。
これでプログラムの作成は完了です。

private void button_実行_Click(object sender, EventArgs e)
{
    // スクリプトのアセンブリ設定
    var options = ScriptOptions.Default.AddImports("System", "System.Collections.Generic");

    // スクリプトのオブジェクト生成
    var script = CSharpScript.Create(textBox_処理.Text, options);

    // スクリプト実行
    var result = script.RunAsync().Result;

    // 結果出力
    if(result.ReturnValue != null)
        textBox_実行結果.Text = result.ReturnValue.ToString();
}

Roslynを使ってみる -実行編-

最後に、作成したプログラムを実行してみましょう。
今回は簡単なスクリプトを実行してみます。

例1. 簡単な足し算

変数aに100、変数bに200を代入し、a+bの結果を返すスクリプトを実行します。
100+200=300となるため、正しい結果が返ってきていることが分かります。

例2. リストから値を取得

アセンブリ設定に「”System.Collections.Generic”」を追加してあるので、リストを使うことができます。
また、外部ライブラリについても同様に、アセンブリ設定に追加することで使用が可能です。
先頭でリストを生成後、Addでリストに値を追加し、指定したインデックスの値を返すスクリプトを実行します。
リストのインデックスは0スタートとなるため、各インデックスには以下の値が入っていることになります。
インデックスが0のとき → ”a”
インデックスが1のとき → ”b”
インデックスが2のとき → ”c”
インデックスが1のときの値を取得できていますね。

ちなみに、アセンブリ設定はスクリプト内に記載することも可能です。
スクリプトのアセンブリ設定を以下のように修正し、スクリプトの先頭行に「using System.Collections.Generic;」を追加します。

  // スクリプトのアセンブリ設定
    var options = ScriptOptions.Default.AddImports("System");

同様の結果が取得できました。

最後に

今回は Roslyn for Scripting を使って、簡単なプログラムを作成してみました。
動的に処理を書き替えられるので、関数の引数を書き替えたり、関数の実行順を並び替えたり、といったプログラム等も実装できそうですね。
ここでは基本的な機能しか紹介していないので、興味を持った方はぜひ調べてみてください。

ここまで読んでいただき、ありがとうございました。
ご質問やご要望、ご相談などありましたら、下記お問い合わせフォームからお気軽にご連絡ください。
http://www.net-nsi.co.jp/toiawase.html

タイトルとURLをコピーしました