Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

C#スクリプティングをアプリケーションで使用する

361 views

Published on

城東.NET 勉強会 #2

Published in: Spiritual
  • Writing a good research paper isn't easy and it's the fruit of hard work. For help you can check writing expert. Check out, please ⇒ www.HelpWriting.net ⇐ I think they are the best
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Be the first to like this

C#スクリプティングをアプリケーションで使用する

  1. 1. 2016/11/16 城東.Net #2 C# Scriptingをアプリケー ションで使用する
  2. 2. 自己紹介  HN pierre3(ピエール)  C#好きなDevelopperで2児の父 / Xamarin初めました。  Github:https://github.com/pierre3/  Blog: http://pierre3.hatenablog.com/  Twitter: @pierusan2010
  3. 3. Roslyn C# Scripting
  4. 4. Roslyn C# Scripting  .Netアプリケーション内でC#のスクリプトを実行する機能  [NuGet] PM >Install-Package Microsoft.CodeAnalysis.CSharp.Scripting  詳しくは – Roslyn for Scriptingで、あなたのアプリケーションにもC#スクリプトを!!:kekyo の丼 – C#スクリプト実行 : ++C++; //未確認飛行 C
  5. 5. C#Scriptingを使用したアプリ ケーションの例 その1)文字列で書いた数式をアプリケーション内で実行したい
  6. 6. 文字列で書いた数式をアプリケーション内で実行したい 先日、同僚からこんな質問を受けました。 文字列で書いた数式を読み取っ て、実行するようなC#のライ ブラリとかって知らない? 数式パーサ的なやつ? ググったらいろいろ出てきたけど、 どれがいいのかね? ・・・いや待てよ、ライブラリを 使わずとも、C#のスクリプトを書 いてそのまま実行すればよいので は?
  7. 7. スクリプトの実行結果を表示する(だけの)電卓アプリ  ということで、試しに作ってみました。 – https://github.com/pierre3/CalcScript/
  8. 8. private async Task Calculate() { ErrorMessages = ""; try { var script = CSharpScript.Create(CodeText, ScriptOptions.Default .WithReferences(typeof(object).Assembly,typeof(Enumerable).Assembly) .WithImports( "System", "System.Collections.Generic", "System.Linq"), typeof(ScriptingHost)); var scriptState = await script.RunAsync(scriptingHost); Result = scriptState.ReturnValue.ToString(); Variables = new List<string>( scriptState.Variables.Select(x=>$"{x.Name}= {x.Value}")); } catch(CompilationErrorException e) { ErrorMessages = e.ToString(); Result = "E"; } } await CSharpScript.Create(…).RunAsync(…); で実行 最後の式(;は付けない)の評価の結果が、 RunAsync()の戻り値 ScriptState<object>.ReturnValue で受け取れ る スクリプト内で宣言した変数は ScriptSate<object>.Variables で参照できる スクリプトの実行結果を受け取る
  9. 9. 自作メソッドをAPIとして使う  RunAsync()に渡したオブジェクトのメソッドをスクリプト側でAPIとして使 用することができる public class ScriptingHost { public static double cos(double degree) { return Math.Cos(degree * Math.PI / 180); } public static double sin(double degree) { return Math.Sin(degree * Math.PI / 180); } } var scriptState = await script.RunAsync(scriptingHost);
  10. 10. C#Scriptingを使用したアプリ ケーションの例 その2)CSVファイルのスキーマ(的なもの)をC#スクリプトで書く
  11. 11. CSVファイルのスキーマ(的なもの)をC#スクリプトで書く  CSVファイルをC#で扱うにはCsvHelperが便利! – https://joshclose.github.io/CsvHelper/  柔軟な読み書き設定とクラスマッピング機能を有したCSVライブラリ 名前,生年月日,配偶者,性別,お小遣い 佐藤,1986/09/02,なし,男性,¥1000 鈴木,2001/08/10,なし,男性,¥500 高橋,1974/06/07,あり,女性,¥300 … class Person { public string Name { get; set; } public DateTime Birthday { get; set; } public bool Married { get; set; } public Sex Sex { get; set; } public int PocketMoney { get; set; } } class PersonClassMap:CsvClassMap { public PersonClassMap() { Map(m => m.Name).Name("名前"); Map(m => m.Birthday).Name("生年 月日") .TypeConverterOption("yyyy/MM/dd"); Map(m => m.Married).Name("配偶者") .TypeConverterOption(true,"あり") .TypeConverterOption(false,"なし"); Map(m => m.Sex).Name("性別"); Map(m => m.PocketMoney).Name("お小遣い") .TypeConverterOption("C") .TypeConverterOption(NumberStyles.Currency); } } 簡単な記述で、 きめ細かなクラ スマップの設定 ができる
  12. 12. CSVファイルのスキーマ(的なもの)をC#スクリプトで書く  CsvHelperのクラスマッピングの設定部分をC#スクリプトとして切り出した ら、そのままCSVのスキーマのように使えるのでは? formatA -,-,-,-, -,-,-,-, -,-,-,-, formatB -,-,-,-, -,-,-,-, -,-,-,-, scriptA scriptB
  13. 13. CSVファイルのスキーマ(的なもの)をC#スクリプトで書く  ということで、作ってみたのがこちら – https://github.com/pierre3/CsvEditSharp/ CsvEditSharp  C#スクリプトで記述した設 定ファイルを使って、CSV ファイルの読み込み・クラス マッピングを行い、 DataGridに表示する WPFアプリケーション
  14. 14. 参考(過去に書いたブログ記事より)  CSVのクラスマッピングの定義をC#スクリプトで記述する – CsvHelperでマッピングをスクリプトで記述してWPFのDataGridに表示してみる話  CSVのクラスマッピングの定義をC#スクリプトで記述する (その 2:Converter) – CsvHeplerのClassMapで使用するConverterをDataGridのバインディングでも 使いたい  CSVのクラスマッピングの定義をC#スクリプトで記述する (その3: ValidationRule) – カラム毎にバリデーション機能が使えるようにしてみる
  15. 15. 課題  スクリプトの記述量が多い – ちょっとしたファイルをさくっと表示したいだけでも、最低限の記述は必要 class FieldData { public string Name { get; set; } public DateTime Birthday { get; set; } public string Merried { get; set; } public string Sex { get; set; } public string PocketMoney { get; set; } } RegisterClassMap<FieldData>(classMap => { classMap.Map( m => m.Name ).Name("名前"); classMap.Map( m => m.Birthday ).Name("生年月日"); classMap.Map( m => m.Merried ).Name("配偶者"); classMap.Map( m => m.Sex ).Name("性別"); classMap.Map( m => m.PocketMoney ).Name("お小遣い"); }); これはめんどい!
  16. 16. 最低限必要な記述は自動生成してしまおう!  T4 ランタイムテキストテンプレートを使用 – コード生成と T4 テキスト テンプレート  CSVのヘッダ部と1行目のデータを見て、マップするクラスとクラスマッピング のテンプレートを自動生成する ID,Name,Price 001,Apple,123 Class FieldData { double ID { get; set; } string Apple { get; set; } string Price { get; set; } } RegisterClassMap<FieldData>(classMap => { classMap.Map( m => m.ID ).Name(“ID"); classMap.Map( m => m.Apple ).Name(“Apple"); classMap.Map( m => m.Price ).Name(“Price"); });
  17. 17. まとめ C#スクリプトを使ったアプリケーションを作ってみて
  18. 18. C#スクリプトを使ったアプリケーションを作ってみて  設定ファイルや、動的に実行する処理をC#で記述するので、エンジニアが 使うツール向けかも – エンジニア以外のユーザ向けには、APIを充実させるなど、設計に工夫が必要  設定ファイルとして使った場合、従来のものより記述量が多くなってしまう 危険性がある – これも設計次第ですが・・・ – スクリプト(のテンプレート)を自動生成するのも一つの手
  19. 19. 以上です。 ご清聴ありがとうございました

×