使用Roslyn CTP3(它具有脚本支持,而最新版本中已删除了脚本支持,这就是为什么我要使用旧的支持)如何使用VB脚本引擎获取布尔表达式的结果?我尝试了以下代码,但是在尝试编译脚本代码时收到语法错误。
using Roslyn.Scripting.VisualBasic;
using System;
class Program
{
static void Main()
{
var engine = new ScriptEngine();
engine.AddReference(typeof (object).Assembly);
engine.ImportNamespace("System");
var session = engine.CreateSession();
var result = session.Execute<bool>("True");
Console.WriteLine(result);
}
}
我使用CSharp ScriptEngine尝试了同样的事情,并且运行良好。我也在VB中尝试了相同的代码(认为在VB中使用VB脚本引擎会产生不同的结果),但是我遇到了相同的错误。
如果您没有旧的CTP3,可以在使用Roslyn CTP3的.NET Fiddle的两个示例中看到这一点。
C#http://dotnetfiddle.net/JBlNmK(有效)VB http://dotnetfiddle.net/CeJAeE(语法错误)
编辑:我可能已经找到了通过将函数包装起来的方法... http://dotnetfiddle.net/PJJzrQ
我认为这是VB实施的限制ScriptEngine
。IIRC,VB实现不如CTP中的C#实现完整。
C#实现可以将字符串作为独立的语句,代码块或单个表达式执行。但是,VB实现显然不支持单个表达式,但可以运行独立的语句和代码块。您甚至无法使用Execute<T>()
大多数泛型类型的泛型重载,您需要手动将其强制转换为适当的类型。
您将不得不更改脚本,以便可以通过正常的VB语句获得所需的值。您在这里没有太多选择,但是函数调用是一条评估为值的语句。这也可以使用。
var engine = new ScriptEngine();
var session = engine.CreateSession();
// implement your expression here
session.Execute(@"Function ExecuteExpression As Boolean
Return True
End Function");
//var result = session.Execute<bool>("ExecuteExpression"); // error
var result = (bool)session.Execute("ExecuteExpression");
您可以创建扩展方法来简化此过程。
public static T ExecuteExpression<T>(this Session session, string expressionCode)
{
return (T)session.Execute(String.Format(@"Class _SessionExtensions
Public Shared Function ExecuteExpression As Object
Return {0}
End Function
End Class
_SessionExtensions.ExecuteExpression", expressionCode));
}
这将允许您执行以下操作:
var engine = new ScriptEngine();
var session = engine.CreateSession();
var result = session.ExecuteExpression<bool>("True");
var result2 = session.ExecuteExpression<int>("123 + 4523");
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句