罗斯林VisualBasic.ScriptEngine犯规认识hostObject写在C#(Rosl

2019-09-18 10:05发布

我们的项目需要的能力有一个简单的业务规则,我们的客户可以在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#运行它。

Answer 1:

对于VB脚本,我发现,你必须包含在脚本的开头如下:

Imports ScriptModel

我猜你会自动预挂起上面的代码串让你的用户不需要记住要包含它。

我一直没能得到,当作为ScriptEngine的创造的一部分加到它的工作。 它也似乎没有使用事后工作:

engine.ImportedNamespaces.Append("ScriptModel");

尽管这是一个事实,即事后ImportedNamespaces数为1。用c#你似乎并不需要在所有导入的命名空间。



Answer 2:

我接受了以前的答案,因为它确实给了我一个想法,如何使VB.NET脚本的工作,但仍然HostObject不工作

所以,实际的解决方法包括2个步骤

1)使用进口ScriptModel在VB代码

var vbCode = @"Imports ScriptModel

    If (Row.Code = 12) Then 
        Row.MappedCode = 1
    End If";

2)不要使用HostObject。 行定义为公共静态类

namespace ScriptModel
{
    public static class Row
    {
        public static int Code { get; set; }
        public static int MappedCode { get; set; }
    }
}

我相信,在MS论坛的答案也是正确的, http://social.msdn.microsoft.com/Forums/en-US/roslyn/thread/89970f0b-1c1c-47da-a180-9c4710abc4b9在当前版本HostObject不支持VB,但我希望它会在下一版本支持



文章来源: Roslyn VisualBasic.ScriptEngine doesnt recognize hostObject written on C#