雷达智富

首页 > 内容 > 程序笔记 > 正文

程序笔记

Roslyn脚本化C#代码CSharpScript使用方法

2024-09-08 16

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

更新于:8天前
赞一波!

文章评论

全部评论