Roslyn脚本与强制脚本接口

本文关键字:脚本 接口 Roslyn | 更新日期: 2023-09-27 18:16:39

我有简单的IScript接口。我想强制所有的脚本都实现它。

public interface IScript<T>
{
    T Execute(object[] args);
}

我想使用Roslyn脚本API来实现这一点。这样的事情在CSScript中是可能的(参见Interface Alignment)。

var code = @"
    using System;
    using My.Namespace.With.IScript;                
    public class Script : IScript<string>
    {
        public string Execute()
        {
            return ""Hello from script!"";
        }
    }
";
var script = CSharpScript.Create(code, ScriptOptions.Default);  // + Load all assemblies and references
script.WithInterface(typeof(IScript<string>));                  // I need something like this, to enforce interface
script.Compile();
string result =  script.Execute();                              // and then execute script
Console.WriteLine(result);                                      // print "Hello from script!"

Roslyn脚本与强制脚本接口

类型安全是在(应用程序的)编译时强制执行的静态事情。创建和运行CSharpScript是在运行时完成的。所以你不能在运行时强制类型安全。

也许CSharpScript不是正确的方式去。通过使用这个SO答案,你可以将一段c#代码编译到内存中,并使用Roslyn生成汇编字节。

然后更改

object obj = Activator.CreateInstance(type);

IScript<string> obj = Activator.CreateInstance(type) as IScript<string>;
if (obj != null) {
    obj.Execute(args);
}