使用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,你可以在这两个使用.NET Fiddle的例子中看到这个,它使用Roslyn CTP3 ......
C#http://dotnetfiddle.net/JBlNmK(有效) VB http://dotnetfiddle.net/CeJAeE(语法错误)
编辑:我可能通过在其周围包裹一个函数找到了方法... http://dotnetfiddle.net/PJJzrQ
答案 0 :(得分:2)
我认为这是对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");