使用Roslyn脚本化C#代码,C#动态脚本实现方案

 

【前言】

  Roslyn 是微软公司开源的 .NET 编译器。

  编译器支持 C# 和 Visual Basic 代码编译,并提供丰富的代码分析 API。

  Roslyn不仅仅可以直接编译输出,难能可贵的就是上述描述中的开放了编译的API,使得代码脚本化成为了可能。

  关于Roslyn,本文不做过多介绍,因为再介绍的丰满终究不及官方文档介绍的细腻,各位请移步官方说明地址:https://github.com/dotnet/roslyn/wiki

  

  众所周知,我们实现的Filter往往是写死的代码在项目里面的,一经发布,便不能随时改动,有过Paas平台开发经验的同僚更能体会到租户灵活配置个性化需求是一个难点。

  那么,我们怎么能针对不同的业务逻辑灵活地在已经部署好地站点上制定不同地业务逻辑呢,让我们一起走进这个世界。

  本文将通过一个小Demo的实现讲述如何使用Roslyn脚本化代码,以及如何采用脚本化的代码对一个网站接口实现脚本控制Before和After过滤器的功效。

  Demo 源码地址:https://github.com/sevenTiny/Demo.CSharpScript

一、熟悉Roslyn API

  • 首先项目中引入微软脚本API相关的Nuget包

  按顺序引入下面三个Nuget包

  Microsoft.CodeAnalysis.CSharp   

  Microsoft.CodeAnalysis.Scripting 

  Microsoft.CodeAnalysis.CSharp.Scripting

  • 了解API

  1.我们写一个Run脚本的Demo:

复制代码
[Fact] [Trait("desc", "调用动态创建的脚本方法")] public void CallScriptFromText() {     string code1 = @"     public class ScriptedClass     {         public string HelloWorld { get; set; }         public ScriptedClass()         {             HelloWorld = ""Hello Roslyn!"";         }     }";      var script = CSharpScript.RunAsync(code1).Result;      var result = script.ContinueWithAsync<string>("new ScriptedClass().HelloWorld").Result;      Assert.Equal("Hello Roslyn!", result.ReturnValue); }
复制代码

  Demo中,我们用字符串定义了一个类,并在其中写了小段逻辑,通过Run方法和ContinueWityAsync方法分别执行了两段脚本,最终的结果输出了:

 "Hello Roslyn!"

  2.我们再写一个脚本调用已存在的类的Demo:

  首先我们定义一个类型:

复制代码
public class TestClass {     public string arg1 { get; set; }      public string GetString()     {         return "hello world!";     }      public string DealString(string a)     {         return a;     } }
复制代码

  然后写脚本执行该类型里面的DealString方法(带参数和返回值的)

复制代码
[Trait("desc", "使用类的实例调用类的带参数的方法,并获取返回值")] [Theory] [InlineData("123")] pu
                    
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信