首页 > 解决方案 > Roslyn 抛出异常 'Item' 未声明。由于其保护级别,它可能无法访问

问题描述

我正在尝试使用 roslyn 脚本引擎执行 vb 脚本 我在构造函数中的实现如下所示我初始化了所有成员

Private Sub New(ByVal info As LoggedInUserInfo)
        _info = info
        Item = New ScriptItem()

        _vbEngine = New VisualBasic.ScriptEngine()

        Call {GetType(Type).Assembly, GetType(ICollection).Assembly, GetType(ListDictionary).Assembly, GetType(Console).Assembly, GetType(ScriptItem).Assembly, GetType(IEnumerable(Of)).Assembly, GetType(IQueryable).Assembly, GetType(DataSet).Assembly, [GetType]().Assembly}.ToList().ForEach(Sub(asm) _vbEngine.AddReference(asm))
        'Import common namespaces
        Call {"System", "System.Linq", "System.Collections", "System.Collections.Generic"}.ToList().ForEach(Sub(ns) _vbEngine.ImportNamespace(ns))



    End Sub

执行脚本时

我称之为

Public Function Execute(ByVal vbScript As String) As IExecuteScript
        _dummyMode = True
        Try
            Dim session = _vbEngine.CreateSession(Me, GetType(ProcessScriptEngine))
            session.AddReference(Assembly.Load(GetType(ProcessScriptEngine).Assembly.GetName()))
            session.AddReference(Assembly.Load(GetType(ScriptItem).Assembly.GetName()))
            session.Execute(vbScript)
            Return Me

        Catch exception As Exception
            Throw
        End Try
    End Function

项目是我声明的公共成员Public Item As ScriptItem但是当我运行测试时它会抛出如下异常

Roslyn.Compilers.CompilationErrorException : (1) : error BC30451: 'Item' is not declared. It may be inaccessible due to its protection level.
   at Roslyn.Scripting.CommonScriptEngine.CompilationError(DiagnosticBag localDiagnostics, DiagnosticBag diagnostics)
   at Roslyn.Scripting.CommonScriptEngine.Compile(String code, String path, DiagnosticBag diagnostics, Session session, Type delegateType, Type returnType, CancellationToken cancellationToken, Boolean isInteractive, Boolean isExecute, CommonCompilation& compilation, Delegate& factory)
   at Roslyn.Scripting.CommonScriptEngine.Execute[T](String code, String path, DiagnosticBag diagnostics, Session session, Boolean isInteractive)
   at Roslyn.Scripting.Session.Execute(String code)
   at ProcessScriptEngine.VerifyVbScript(String vbScript) in D:\Paymate\Payroll\Core\CoreScripting\ProcessScriptEngine.vb:line 100
   at ScriptTest.Tests.<Test1>d__1.MoveNext() in D:\Paymate\Payroll\Core\ScriptTest\UnitTest.cs:line 56
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at NUnit.Framework.Internal.TaskAwaitAdapter.GenericAdapter`1.GetResult()
   at NUnit.Framework.Internal.AsyncToSyncAdapter.Await(Func`1 invoke)
   at NUnit.Framework.Internal.Commands.TestMethodCommand.Execute(TestExecutionContext context)
   at NUnit.Framework.Internal.Commands.BeforeAndAfterTestCommand.<>c__DisplayClass1_0.<Execute>b__0()
   at NUnit.Framework.Internal.Commands.BeforeAndAfterTestCommand.RunTestMethodInThreadAbortSafeZone(TestExecutionContext context, Action action)

任何想法发生了什么?

更新

传递脚本如下所示

"Item.Rate = 100.01D\nItem.Units = 100.10D \nItem.Amount = 100.20D\nItem.Gross = 200D\nItem.BaseWage = 300D\n\n\n\n\n\n"

标签: .netvb.netroslynscriptengine

解决方案


推荐阅读