[C#] Microsoft.CodeAnalysis.CSharp.Scripting(Roslyn) 動態執行 C# Code 簡單入門

2017-01-25

最近因為一些需求需要動態去執行一些C# code. 這邊筆記一下,首先你的專案要設定為.net framework 4.6 以上不然會出現
Image 656

第二步到nuget 上面下載 Microsoft.CodeAnalysis.CSharp.Scripting 套件,當然相依姓nuget 會幫你處理好,別擔心

Image 655

 

之後就是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("");

結果:
image

第二個測試,我嘗試建立一個物件,並且讓他講這物件傳出來,我們接到後再去把東西印出來

            // 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("");

結果:
image

很簡單吧,用途其實很廣,如果有需要自行取用,基本上我也沒這麼厲害,都是看下面網頁慢慢實作出來的,有機會一定要看看下面的連結。

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/


當麻許的超技八 2014 | Donma Hsu Design.