通過Roslyn動態生成程序集


之前寫過篇文章如何通過Roslyn構建自己的C#腳本,今天本來打算測試一下這部分API在新的版本中的變化,結果發現它的腳本引擎找不到了,翻了一下官方文檔,貌似說暫時性的移除了。便看了一下它動態生成程序集的API,這里簡單的介紹一下使用方法。

首先需要在NUGET中添加CodeAnalysis的引用(目前還是預覽版,注意在NuGet中開啟預覽版的選擇)

動態生成程序集主要有如下幾步

  1. 將代碼解析成語法樹
  2. 將語法樹進行編譯
  3. 通過Emit生成程序集

然后就是如何使用了

  1. 動態加載程序集
  2. 通過反射調用方法

代碼如下:

    static void CompileAndRun()
    {
        var text = @"
        public class Calculator
        {
            public static int Evaluate() { return 3 + 2 * 5; }
        }";

        var tree = SyntaxFactory.ParseSyntaxTree(text);

        var compilation = CSharpCompilation.Create("calc.dll", new[] { tree },
            options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary),
            references: new[] { new MetadataFileReference(typeof(object).Assembly.Location) });

        Assembly compiledAssembly;
        using (var stream = new MemoryStream())
        {
            var compileResult = compilation.Emit(stream);
            compiledAssembly = Assembly.Load(stream.GetBuffer());
        }

        var calculatorClass = compiledAssembly.GetType("Calculator");
        var evaluateMethod = calculatorClass.GetMethod("Evaluate");
        var result = evaluateMethod.Invoke(null, null).ToString();
        Console.WriteLine(result);
    }

另外,若只是實現本例所示的功能的話,.Net 1.0中就存在的CodeDom就能實現,上面的步驟和CodeDom的也是非常類似的。CodeDom實際上是Roslyn的前身,Roslyn能提供更多高級的功能,關於它們之間的區別和聯系,StackWverFlow上的一篇帖子Microsoft Roslyn vs. CodeDom里介紹得比較詳細,這里我就不多介紹了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM