2020-08-10
389 0Roslyn 是微软公司开源的 .NET 编译器。编译器支持 C# 和 Visual Basic 代码编译,并提供丰富的代码分析 API。Roslyn不仅仅可以直接编译输出,难能可贵的就是上述描述中的开放了编译的API,使得代码脚本化成为了可能。
首先通过Nuget安装Microsoft.CodeAnalysis.CSharp.Scripting
再代码中引用
using Microsoft.CodeAnalysis.CSharp.Scripting;
using Microsoft.CodeAnalysis.Scripting;
以下是示例代码供参考
using Microsoft.CodeAnalysis.CSharp.Scripting; using Microsoft.CodeAnalysis.Scripting; namespace MyLab.Roslyn { public class RoslynTest { public static void Run() { string code1 = @" public class ScriptedClass { public string HelloWorld { get; set; } public ScriptedClass() { HelloWorld = ""Hello Roslyn!""; } }"; // 通过Run方法和ContinueWityAsync方法分别执行了两段脚本 var script1 = CSharpScript.RunAsync(code1).Result; var result1 = script1.ContinueWithAsync<string>("new ScriptedClass().HelloWorld").Result; Console.WriteLine(result1.ReturnValue); var script2 = CSharpScript.Create<string>("return new MyClass().GetInfo();", ScriptOptions.Default // 明确程序集要引用的类型,类似于引用一个dll .WithReferences(typeof(MyClass).Assembly) // 明确代码中引用的类型,类似于using .WithImports("MyLab.Roslyn"), // 指定了传递参数需要用到的类型 globalsType: typeof(MyClass)); // Compile方法将脚本编译并保存到内存中,待调用 script2.Compile(); var result2 = script2.RunAsync(new MyClass()).Result; Console.WriteLine(result2.ReturnValue); } } public class MyClass { public int Id =>1; public string Name => "PaulYu"; public string GetInfo() { return $"My Id is {Id},My Name is {Name}."; } } }
第一种方法用字符串定义了一个类,并且运行了类包含的方法。
第二种是调用已经存在的类的方法。
运行结果
Roslyn的官方说明地址:https://github.com/dotnet/roslyn/wiki
更多API请查看https://github.com/dotnet/roslyn/wiki/Scripting-API-Samples