在Roslyn CTP3中执行布尔表达式

时间:2014-04-16 14:56:16

标签: c# roslyn

使用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

1 个答案:

答案 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");