You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Roslyn执行VB脚本报错“Item未声明,可能因保护级别无法访问”如何解决?

问题原因

  • ProcessScriptEngine类本身的访问修饰符非Public:VB.NET默认类修饰符为Friend,仅当前程序集可见,Roslyn脚本属于外部执行上下文,无法访问Friend类的公开成员。
  • Roslyn VB脚本引擎默认不自动把宿主对象成员映射为全局变量:直接写Item会被识别为未声明的全局变量,不会自动关联到宿主实例的Item成员。
  • ScriptItem类访问修饰符非Public,导致脚本无法识别该类型。

解决方案

按照优先级依次排查修改:

  1. 调整类型访问级别
    将ProcessScriptEngine、ScriptItem类的访问修饰符显式声明为Public,Item成员保持Public Item As ScriptItem的声明即可。
  2. 脚本访问时增加宿主前缀
    将传入的脚本内容中所有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
  1. 注册全局变量(可选,无需修改脚本)
    如果不想在脚本中写Me前缀,可以在创建Session后手动将Item注册为全局变量,添加一行代码即可:
Dim session = _vbEngine.CreateSession(Me, GetType(ProcessScriptEngine))
' 新增如下代码
session.SetVariable("Item", Me.Item)
session.AddReference(Assembly.Load(GetType(ProcessScriptEngine).Assembly.GetName()))
  1. 移除冗余代码(可选优化)
    构造函数中已经添加了当前程序集和ScriptItem所在程序集的引用,Execute方法中重复添加引用的代码可以删除,避免重复加载引发的访问冲突。

内容的提问来源于stack exchange,提问作者Gayan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 12:24:05