[C#] Microsoft.CodeAnalysis.CSharp.Scripting(Roslyn) 動態執行 C# Code 簡單入門
2017-01-25
最近因為一些需求需要動態去執行一些C# code. 這邊筆記一下,首先你的專案要設定為.net framework 4.6 以上不然會出現
第二步到nuget 上面下載 Microsoft.CodeAnalysis.CSharp.Scripting 套件,當然相依姓nuget 會幫你處理好,別擔心
之後就是Code 得部分,首先我建立一個Agent 其中我寫一個Excute 的method 並開一個code 的參數,只要傳入C# code :
using Microsoft.CodeAnalysis.CSharp.Scripting; using Microsoft.CodeAnalysis.Scripting; namespace ScriptEngineUtility { public class Agent { private static ScriptState<object> scriptState = null; public static dynamic Excute(string code) { scriptState = scriptState == null ? CSharpScript.RunAsync(code).Result : scriptState.ContinueWithAsync(code).Result; if (scriptState.ReturnValue != null && !string.IsNullOrEmpty(scriptState.ReturnValue.ToString())) return scriptState.ReturnValue; return null; } } }
參考來源 : https://github.com/chribben/ScriptSharp
接下來就是執行測試的部分 :
第一個測試,測試直接return 一個常數100
//Test1 直接 return Console.WriteLine("==== Test1 => retuen 100 ===="); var test1 = Agent.Excute(@"return 100;"); Console.WriteLine(test1); Console.WriteLine("");
第二個測試,我嘗試建立一個物件,並且讓他講這物件傳出來,我們接到後再去把東西印出來
// Test2 直接 建立Class Console.WriteLine("==== Test2 => retuen dynamic ===="); var text = @" using System; public class User { public string Name {get;set;} public DateTime Birth {get;set;} } var user=new User(); user.Name=""許當麻""; user.Birth=new DateTime(1980,6,21); return user; "; dynamic test2 = Agent.Excute( text); Console.WriteLine(test2.Name + "," + (test2.Birth is DateTime ? (DateTime) test2.Birth : new DateTime()).ToString()); Console.WriteLine("");
很簡單吧,用途其實很廣,如果有需要自行取用,基本上我也沒這麼厲害,都是看下面網頁慢慢實作出來的,有機會一定要看看下面的連結。
Source code :
https://github.com/donma/DynamicRunCS
參考資料:
https://blogs.msdn.microsoft.com/msdntaiwan/2014/06/11/roslyn-1/
https://github.com/chribben/ScriptSharp
https://blog.jayway.com/2015/05/09/using-roslyn-to-build-a-simple-c-interactive-script-engine/