SlideShare a Scribd company logo
1 of 19
2016/11/16 城東.Net #2
C# Scriptingをアプリケー
ションで使用する
自己紹介
 HN pierre3(ピエール)
 C#好きなDevelopperで2児の父 / Xamarin初めました。
 Github:https://github.com/pierre3/
 Blog: http://pierre3.hatenablog.com/
 Twitter: @pierusan2010
Roslyn C# Scripting
Roslyn C# Scripting
 .Netアプリケーション内でC#のスクリプトを実行する機能
 [NuGet] PM >Install-Package
Microsoft.CodeAnalysis.CSharp.Scripting
 詳しくは
– Roslyn for Scriptingで、あなたのアプリケーションにもC#スクリプトを!!:kekyo
の丼
– C#スクリプト実行 : ++C++; //未確認飛行 C
C#Scriptingを使用したアプリ
ケーションの例
その1)文字列で書いた数式をアプリケーション内で実行したい
文字列で書いた数式をアプリケーション内で実行したい
先日、同僚からこんな質問を受けました。
文字列で書いた数式を読み取っ
て、実行するようなC#のライ
ブラリとかって知らない?
数式パーサ的なやつ?
ググったらいろいろ出てきたけど、
どれがいいのかね?
・・・いや待てよ、ライブラリを
使わずとも、C#のスクリプトを書
いてそのまま実行すればよいので
は?
スクリプトの実行結果を表示する(だけの)電卓アプリ
 ということで、試しに作ってみました。
– https://github.com/pierre3/CalcScript/
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 で参照できる
スクリプトの実行結果を受け取る
自作メソッドを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);
C#Scriptingを使用したアプリ
ケーションの例
その2)CSVファイルのスキーマ(的なもの)をC#スクリプトで書く
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);
}
}
簡単な記述で、
きめ細かなクラ
スマップの設定
ができる
CSVファイルのスキーマ(的なもの)をC#スクリプトで書く
 CsvHelperのクラスマッピングの設定部分をC#スクリプトとして切り出した
ら、そのままCSVのスキーマのように使えるのでは?
formatA
-,-,-,-,
-,-,-,-,
-,-,-,-,
formatB
-,-,-,-,
-,-,-,-,
-,-,-,-,
scriptA
scriptB
CSVファイルのスキーマ(的なもの)をC#スクリプトで書く
 ということで、作ってみたのがこちら
– https://github.com/pierre3/CsvEditSharp/
CsvEditSharp
 C#スクリプトで記述した設
定ファイルを使って、CSV
ファイルの読み込み・クラス
マッピングを行い、
DataGridに表示する
WPFアプリケーション
参考(過去に書いたブログ記事より)
 CSVのクラスマッピングの定義をC#スクリプトで記述する
– CsvHelperでマッピングをスクリプトで記述してWPFのDataGridに表示してみる話
 CSVのクラスマッピングの定義をC#スクリプトで記述する (その
2:Converter)
– CsvHeplerのClassMapで使用するConverterをDataGridのバインディングでも
使いたい
 CSVのクラスマッピングの定義をC#スクリプトで記述する (その3:
ValidationRule)
– カラム毎にバリデーション機能が使えるようにしてみる
課題
 スクリプトの記述量が多い
– ちょっとしたファイルをさくっと表示したいだけでも、最低限の記述は必要
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("お小遣い");
});
これはめんどい!
最低限必要な記述は自動生成してしまおう!
 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");
});
まとめ
C#スクリプトを使ったアプリケーションを作ってみて
C#スクリプトを使ったアプリケーションを作ってみて
 設定ファイルや、動的に実行する処理をC#で記述するので、エンジニアが
使うツール向けかも
– エンジニア以外のユーザ向けには、APIを充実させるなど、設計に工夫が必要
 設定ファイルとして使った場合、従来のものより記述量が多くなってしまう
危険性がある
– これも設計次第ですが・・・
– スクリプト(のテンプレート)を自動生成するのも一つの手
以上です。
ご清聴ありがとうございました

More Related Content

Viewers also liked

Win32 APIをてなずけよう
Win32 APIをてなずけようWin32 APIをてなずけよう
Win32 APIをてなずけようKouji Matsui
 
式の体を成して無い式を式の体を成すように式と式木で何とかする式
式の体を成して無い式を式の体を成すように式と式木で何とかする式式の体を成して無い式を式の体を成すように式と式木で何とかする式
式の体を成して無い式を式の体を成すように式と式木で何とかする式Kouji Matsui
 
Azure Service Fabric 概要
Azure Service Fabric 概要Azure Service Fabric 概要
Azure Service Fabric 概要Daiyu Hatakeyama
 
.NET Coreとツール類の今
.NET Coreとツール類の今.NET Coreとツール類の今
.NET Coreとツール類の今Yuki Igarashi
 
Visual Studio ~ 過去、現在、そして未来
Visual Studio ~ 過去、現在、そして未来Visual Studio ~ 過去、現在、そして未来
Visual Studio ~ 過去、現在、そして未来Akira Inoue
 
Empower Every App, Every Developer ~ 統合開発プラットフォーム Visual Studio の進化 ~
Empower Every App, Every Developer ~ 統合開発プラットフォーム Visual Studio の進化 ~Empower Every App, Every Developer ~ 統合開発プラットフォーム Visual Studio の進化 ~
Empower Every App, Every Developer ~ 統合開発プラットフォーム Visual Studio の進化 ~Akira Inoue
 
Consumer Driven Contractsで REST API/マイクロサービスをテスト #m3tech
Consumer Driven Contractsで REST API/マイクロサービスをテスト #m3techConsumer Driven Contractsで REST API/マイクロサービスをテスト #m3tech
Consumer Driven Contractsで REST API/マイクロサービスをテスト #m3techToshiaki Maki
 
HTML5 Web アプリケーションのセキュリティ
HTML5 Web アプリケーションのセキュリティHTML5 Web アプリケーションのセキュリティ
HTML5 Web アプリケーションのセキュリティ彰 村地
 
JaSST2017_大規模業務システムにおける再利用可能なテスト自動化の取り組み
JaSST2017_大規模業務システムにおける再利用可能なテスト自動化の取り組みJaSST2017_大規模業務システムにおける再利用可能なテスト自動化の取り組み
JaSST2017_大規模業務システムにおける再利用可能なテスト自動化の取り組みHideki Sugimoto
 
Swaggerで始めるモデルファーストなAPI開発
Swaggerで始めるモデルファーストなAPI開発Swaggerで始めるモデルファーストなAPI開発
Swaggerで始めるモデルファーストなAPI開発Takuro Sasaki
 

Viewers also liked (11)

Win32 APIをてなずけよう
Win32 APIをてなずけようWin32 APIをてなずけよう
Win32 APIをてなずけよう
 
Net fringejp2016
Net fringejp2016Net fringejp2016
Net fringejp2016
 
式の体を成して無い式を式の体を成すように式と式木で何とかする式
式の体を成して無い式を式の体を成すように式と式木で何とかする式式の体を成して無い式を式の体を成すように式と式木で何とかする式
式の体を成して無い式を式の体を成すように式と式木で何とかする式
 
Azure Service Fabric 概要
Azure Service Fabric 概要Azure Service Fabric 概要
Azure Service Fabric 概要
 
.NET Coreとツール類の今
.NET Coreとツール類の今.NET Coreとツール類の今
.NET Coreとツール類の今
 
Visual Studio ~ 過去、現在、そして未来
Visual Studio ~ 過去、現在、そして未来Visual Studio ~ 過去、現在、そして未来
Visual Studio ~ 過去、現在、そして未来
 
Empower Every App, Every Developer ~ 統合開発プラットフォーム Visual Studio の進化 ~
Empower Every App, Every Developer ~ 統合開発プラットフォーム Visual Studio の進化 ~Empower Every App, Every Developer ~ 統合開発プラットフォーム Visual Studio の進化 ~
Empower Every App, Every Developer ~ 統合開発プラットフォーム Visual Studio の進化 ~
 
Consumer Driven Contractsで REST API/マイクロサービスをテスト #m3tech
Consumer Driven Contractsで REST API/マイクロサービスをテスト #m3techConsumer Driven Contractsで REST API/マイクロサービスをテスト #m3tech
Consumer Driven Contractsで REST API/マイクロサービスをテスト #m3tech
 
HTML5 Web アプリケーションのセキュリティ
HTML5 Web アプリケーションのセキュリティHTML5 Web アプリケーションのセキュリティ
HTML5 Web アプリケーションのセキュリティ
 
JaSST2017_大規模業務システムにおける再利用可能なテスト自動化の取り組み
JaSST2017_大規模業務システムにおける再利用可能なテスト自動化の取り組みJaSST2017_大規模業務システムにおける再利用可能なテスト自動化の取り組み
JaSST2017_大規模業務システムにおける再利用可能なテスト自動化の取り組み
 
Swaggerで始めるモデルファーストなAPI開発
Swaggerで始めるモデルファーストなAPI開発Swaggerで始めるモデルファーストなAPI開発
Swaggerで始めるモデルファーストなAPI開発
 

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

Roslynで体験してみるC#スクリプト #cs_fukuoka
Roslynで体験してみるC#スクリプト #cs_fukuokaRoslynで体験してみるC#スクリプト #cs_fukuoka
Roslynで体験してみるC#スクリプト #cs_fukuokaYuta Matsumura
 
Visual Studio Code で C# でのアプリ開発
Visual Studio Code で C# でのアプリ開発Visual Studio Code で C# でのアプリ開発
Visual Studio Code で C# でのアプリ開発m ishizaki
 
いま考えられる限り最も速く対話型アプリを開発する方法
いま考えられる限り最も速く対話型アプリを開発する方法いま考えられる限り最も速く対話型アプリを開発する方法
いま考えられる限り最も速く対話型アプリを開発する方法Kenichiro Nakamura
 
Computer Vision と Translator Text API 使ってみた
Computer Vision と Translator Text API 使ってみたComputer Vision と Translator Text API 使ってみた
Computer Vision と Translator Text API 使ってみたYoshito Tabuchi
 
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニーUnity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニーYoshifumi Kawai
 
The Fastest Possible Way to Develop an Interactive App
The Fastest Possible Way to Develop an Interactive AppThe Fastest Possible Way to Develop an Interactive App
The Fastest Possible Way to Develop an Interactive AppLINE Corporation
 
TypeScriptでCLIアプリケーション開発
TypeScriptでCLIアプリケーション開発TypeScriptでCLIアプリケーション開発
TypeScriptでCLIアプリケーション開発Shuto Suzuki
 
.NETの自作ツール公開手段
.NETの自作ツール公開手段.NETの自作ツール公開手段
.NETの自作ツール公開手段Pierre3 小林
 
C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜
C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜
C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜UnityTechnologiesJapan002
 
(ゲームじゃない方の)switchで遊びたい話
(ゲームじゃない方の)switchで遊びたい話(ゲームじゃない方の)switchで遊びたい話
(ゲームじゃない方の)switchで遊びたい話Masanori Masui
 
「ふくてん」に来てんね
「ふくてん」に来てんね「ふくてん」に来てんね
「ふくてん」に来てんねHideaki Aoyagi
 
iPhoneアプリ無料勉強会 vol2
iPhoneアプリ無料勉強会 vol2iPhoneアプリ無料勉強会 vol2
iPhoneアプリ無料勉強会 vol2codeal
 
PHPからC#のライブラリを呼べるようにしたdotnet_ffiを趣味でつくってみた
PHPからC#のライブラリを呼べるようにしたdotnet_ffiを趣味でつくってみたPHPからC#のライブラリを呼べるようにしたdotnet_ffiを趣味でつくってみた
PHPからC#のライブラリを呼べるようにしたdotnet_ffiを趣味でつくってみたjohgus johgus
 
C#のコード解析ってなんだ@20160825 CenterCLR.学生 #1
C#のコード解析ってなんだ@20160825 CenterCLR.学生 #1C#のコード解析ってなんだ@20160825 CenterCLR.学生 #1
C#のコード解析ってなんだ@20160825 CenterCLR.学生 #1MasuqaT
 
2020/06/16 tsjp-azure-staticwebapps-vs_codespaces
2020/06/16 tsjp-azure-staticwebapps-vs_codespaces2020/06/16 tsjp-azure-staticwebapps-vs_codespaces
2020/06/16 tsjp-azure-staticwebapps-vs_codespacesIssei Hiraoka
 
Power shell で DSL
Power shell で DSLPower shell で DSL
Power shell で DSLurasandesu
 
Movable Type から BOT を作ろう! ~ Data API と Microsoft BOT Framework ~
Movable Type から BOT を作ろう! ~ Data API と Microsoft BOT Framework ~Movable Type から BOT を作ろう! ~ Data API と Microsoft BOT Framework ~
Movable Type から BOT を作ろう! ~ Data API と Microsoft BOT Framework ~Osamu Monoe
 
[POST.Dev Japan] VS Code で試みる開発体験の向上
[POST.Dev Japan] VS Code で試みる開発体験の向上[POST.Dev Japan] VS Code で試みる開発体験の向上
[POST.Dev Japan] VS Code で試みる開発体験の向上Tomomi Imura
 

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

Roslynで体験してみるC#スクリプト #cs_fukuoka
Roslynで体験してみるC#スクリプト #cs_fukuokaRoslynで体験してみるC#スクリプト #cs_fukuoka
Roslynで体験してみるC#スクリプト #cs_fukuoka
 
Visual Studio Code で C# でのアプリ開発
Visual Studio Code で C# でのアプリ開発Visual Studio Code で C# でのアプリ開発
Visual Studio Code で C# でのアプリ開発
 
いま考えられる限り最も速く対話型アプリを開発する方法
いま考えられる限り最も速く対話型アプリを開発する方法いま考えられる限り最も速く対話型アプリを開発する方法
いま考えられる限り最も速く対話型アプリを開発する方法
 
Computer Vision と Translator Text API 使ってみた
Computer Vision と Translator Text API 使ってみたComputer Vision と Translator Text API 使ってみた
Computer Vision と Translator Text API 使ってみた
 
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニーUnity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
 
The Fastest Possible Way to Develop an Interactive App
The Fastest Possible Way to Develop an Interactive AppThe Fastest Possible Way to Develop an Interactive App
The Fastest Possible Way to Develop an Interactive App
 
TypeScriptでCLIアプリケーション開発
TypeScriptでCLIアプリケーション開発TypeScriptでCLIアプリケーション開発
TypeScriptでCLIアプリケーション開発
 
.NETの自作ツール公開手段
.NETの自作ツール公開手段.NETの自作ツール公開手段
.NETの自作ツール公開手段
 
C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜
C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜
C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜
 
(ゲームじゃない方の)switchで遊びたい話
(ゲームじゃない方の)switchで遊びたい話(ゲームじゃない方の)switchで遊びたい話
(ゲームじゃない方の)switchで遊びたい話
 
「ふくてん」に来てんね
「ふくてん」に来てんね「ふくてん」に来てんね
「ふくてん」に来てんね
 
iPhoneアプリ無料勉強会 vol2
iPhoneアプリ無料勉強会 vol2iPhoneアプリ無料勉強会 vol2
iPhoneアプリ無料勉強会 vol2
 
PHPからC#のライブラリを呼べるようにしたdotnet_ffiを趣味でつくってみた
PHPからC#のライブラリを呼べるようにしたdotnet_ffiを趣味でつくってみたPHPからC#のライブラリを呼べるようにしたdotnet_ffiを趣味でつくってみた
PHPからC#のライブラリを呼べるようにしたdotnet_ffiを趣味でつくってみた
 
C#のコード解析ってなんだ@20160825 CenterCLR.学生 #1
C#のコード解析ってなんだ@20160825 CenterCLR.学生 #1C#のコード解析ってなんだ@20160825 CenterCLR.学生 #1
C#のコード解析ってなんだ@20160825 CenterCLR.学生 #1
 
2020/06/16 tsjp-azure-staticwebapps-vs_codespaces
2020/06/16 tsjp-azure-staticwebapps-vs_codespaces2020/06/16 tsjp-azure-staticwebapps-vs_codespaces
2020/06/16 tsjp-azure-staticwebapps-vs_codespaces
 
ゼロから始めるQ#
ゼロから始めるQ#ゼロから始めるQ#
ゼロから始めるQ#
 
Power shell で DSL
Power shell で DSLPower shell で DSL
Power shell で DSL
 
Movable Type から BOT を作ろう! ~ Data API と Microsoft BOT Framework ~
Movable Type から BOT を作ろう! ~ Data API と Microsoft BOT Framework ~Movable Type から BOT を作ろう! ~ Data API と Microsoft BOT Framework ~
Movable Type から BOT を作ろう! ~ Data API と Microsoft BOT Framework ~
 
C# 7 New Features
C# 7 New FeaturesC# 7 New Features
C# 7 New Features
 
[POST.Dev Japan] VS Code で試みる開発体験の向上
[POST.Dev Japan] VS Code で試みる開発体験の向上[POST.Dev Japan] VS Code で試みる開発体験の向上
[POST.Dev Japan] VS Code で試みる開発体験の向上
 

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