c# - 将对象实例传递给 Roslyn ScriptEngine

标签 c# .net roslyn

我正在寻找一个 C# 脚本引擎,它可以解释 C# 代码块,同时维护上下文。例如,如果输入:var a = 1;,然后输入 a + 3,它将输出 4。 我知道 MS Roslyn ,它确实这样做了,但它是一个沙箱(关于启动它的程序)。所以,如果我创建一个 ScriptEngine 实例和一个 MyClass 实例(只是我的一个任意类),我没有选择传递 my_class 的引用script_engine

是否有可能以某种方式传递该引用

我想做的是:

ScriptEngine engine; // A Roslyn object
Session session // A Roslyn object

MyClass my_class; // My object

// all required initializations

Submission<object> sm = session.CompileSubmission<object>("var a=1;"); 
dynamic result = sm.Execute(); 

Submission<object> sm = session.CompileSubmission<object>("a + 3;"); 
dynamic result = sm.Execute(); // result is now 4

MyClass my_class;
session.AddReferenceToAnOject(my_class); // function that does not exists, but reflect my intention

Submission<object> sm = session.CompileSubmission<object>("my_class.ToString();"); 
dynamic result = sm.Execute();  // result is no the output of my_class.ToString()

请注意 AddReferenceToAnOject() 是缺失的部分,因为在 roslyn 中没有这样的函数。

最佳答案

答案是在 link 中找到的由@Herman 评论。

事实证明,Roslyn ScriptEngine/Session 支持Host Object 的概念。 为了使用它,定义一个你选择的类,并在 session 创建时传递它。这样做,使该宿主对象的所有 public 成员都可用于 session 内的上下文:

public class MyHostObject
{
    public List<int> list_of_ints;
    public int an_int = 23;
}

var hostObject = new MyHostObject();
hostObject.list_of_ints = new List<int>();
hostObject.list_of_ints.Add(2);
var engine = new ScriptEngine(new[] { hostObject.GetType().Assembly.Location });

// passing reference to hostObject upon session creation
var session = Session.Create(hostObject);

// prints `24` to console
engine.Execute(@"System.Console.WriteLine(an_int + list_of_ints.Count);", 
               session); 

关于c# - 将对象实例传递给 Roslyn ScriptEngine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24733556/

相关文章:

c# - 更改 api Controller 答案上的 json 字段名称

c# - MySQL - 提取表中存在但另一个表中不存在的记录

c# - rsacryptoserviceprovider.VerifyData 总是返回 false

c# - Task.ContinueWith 在非异步方法中的性能与使用 async/await 的对比

c++ - Visual C++ 窗体、简单消息框和将文本从文本字段分配给字符串时出错

c# - 使用 Serilog 时如何在输出消息中获取丰富的属性

c# - C# 6 中的空条件运算符和字符串插值

c# - Xtragrid 一栏可编辑其他不是

c# - 如何通过 Roslyn 获取类的基类名称?

c# - Roslyn CodeFixProvider 给出 VS 2015 错误