Roslyn执行VB脚本报错“Item未声明,可能因保护级别无法访问”如何解决?
问题原因
ProcessScriptEngine类本身的访问修饰符非Public:VB.NET默认类修饰符为Friend,仅当前程序集可见,Roslyn脚本属于外部执行上下文,无法访问Friend类的公开成员。- Roslyn VB脚本引擎默认不自动把宿主对象成员映射为全局变量:直接写
Item会被识别为未声明的全局变量,不会自动关联到宿主实例的Item成员。 ScriptItem类访问修饰符非Public,导致脚本无法识别该类型。
解决方案
按照优先级依次排查修改:
- 调整类型访问级别
将ProcessScriptEngine、ScriptItem类的访问修饰符显式声明为Public,Item成员保持Public Item As ScriptItem的声明即可。 - 脚本访问时增加宿主前缀
将传入的脚本内容中所有Item替换为Me.Item即可正常访问,修改后脚本示例:
Me.Item.Rate = 100.01D Me.Item.Units = 100.10D Me.Item.Amount = 100.20D Me.Item.Gross = 200D Me.Item.BaseWage = 300D
- 注册全局变量(可选,无需修改脚本)
如果不想在脚本中写Me前缀,可以在创建Session后手动将Item注册为全局变量,添加一行代码即可:
Dim session = _vbEngine.CreateSession(Me, GetType(ProcessScriptEngine)) ' 新增如下代码 session.SetVariable("Item", Me.Item) session.AddReference(Assembly.Load(GetType(ProcessScriptEngine).Assembly.GetName()))
- 移除冗余代码(可选优化)
构造函数中已经添加了当前程序集和ScriptItem所在程序集的引用,Execute方法中重复添加引用的代码可以删除,避免重复加载引发的访问冲突。
内容的提问来源于stack exchange,提问作者Gayan
相关产品推荐
相关产品推荐

