我们的项目需要的能力有一个简单的业务规则,我们的客户可以在Visual Basic脚本。 虽然我们的主要程序是写在C#
该客户希望EXECUT可能是这样的脚本(我正在考虑的simpliest可能的情况下)
var vbCode = @"
If (Row.Code = 12) Then
Row.MappedCode = 1
End If";
因此,我创建在C#中RowData类代码和MappedCode性质
namespace ScriptModel
{
public class RowData
{
public int Code { get; set; }
public int MappedCode { get; set; }
}
}
我创建了一个简单的主机对象类像
namespace ScriptModel
{
public class HostObjectModel
{
public RowData Row { get; set; }
}
}
使用Roslyn.Scripting.VisualBasic.ScriptEngine我创建引擎,创建一个会话与HostObjectModel的实例,并进行engine.Execute(vbCode,会话)
var hostObj = new HostObjectModel();
hostObj.Row = new RowData();
hostObj.Row.Code = 12;
var engine = new Roslyn.Scripting.VisualBasic.ScriptEngine(
new Assembly[] {hostObj.GetType().Assembly},
new string[] {"ScriptModel"} );
var session = Session.Create(hostObj);
engine.Execute(vbCode , session);
它告诉我,
(2,25):错误BC30451: '行' 未声明。 它可能无法访问由于其保护级别。
但是,如果我创建C#类似的代码片段
var csharpCode = @"
if (Row.Code == 12)
{
Row.MappedCode = 1;
};";
并使用CSharp.ScriptEngine这一切将正常工作
那么,什么是一个问题,为什么VisualBasic.ScriptEngine没能看到这是在C#编译的类的公共属性,它应该是,我认为,基于相同的MSIL语言或我错了吗?
更新:我安装了Visual Basic和VB的创建ScriptModel库。 我还替换行()函数Row属性无论是在类的声明和vbCode。 无论是帮助。 :(似乎VisualBasic.ScriptEngine不工作在所有的时候,我从C#运行它。