Roslyn 是微软公司开源的 .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
4