TestString не объявлен. Может быть недоступен из-за уровня защиты. (BC30451)

Я пробую некоторые на лету компиляцию кода с использованием VBCodeProvider учебный класс. Я хочу изменить открытую переменную в моей сборке в коде.

у меня есть Public TestString As String = "" в моем приложении.

Это код, который я использую для компиляции:

    Dim codeProvider As New VBCodeProvider()
    Dim optParams As New CompilerParameters
    optParams.ReferencedAssemblies.Add("MyAssembly.exe")
    optParams.ReferencedAssemblies.Add("system.windows.forms.dll")
    optParams.CompilerOptions = "/t:library"
    optParams.GenerateInMemory = True
    Dim results As CompilerResults = codeProvider.CompileAssemblyFromSource(optParams, RichTextBox1.Text)

    If results.Errors.Count > 0 Then
        Dim sb As New StringBuilder("Compilation Failed with the following error(s)" + CR_LF + CR_LF)
        For Each CompErr As CompilerError In results.Errors
            sb.Append(String.Format("Line {0} - {1} ({2}){3}", CompErr.Line, CompErr.ErrorText, CompErr.ErrorNumber, CR_LF))
        Next
        MessageBox.Show(sb.ToString, "Compile Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
    Else
        Dim assy As System.Reflection.Assembly = results.CompiledAssembly
        Dim exeinstance As Object = assy.CreateInstance("Script")
        Dim typ As Type = exeinstance.GetType
        Dim method As MethodInfo = typ.GetMethod("Main")
        method.Invoke(exeinstance, Nothing)
    End If

Это код в моем текстовом поле:

Imports System
Imports MyAssembly

Class Script
    Sub Main()
       TestString="foo"' <-- This line fails compilation
    End Sub
End Class

Я получаю сообщение об ошибке "TestString" не объявлено. Может быть недоступен из-за уровня защиты. (BC30451)

1 ответ

Решение

Точно так же, как обычный VB.NET, а также добавив ссылку, вы должны Imports соответствующее пространство имен или укажите его полностью. (Вы отредактировали вопрос, чтобы включить это.)

После вставки вашего кода в новый консольный проект в VS2008 (потому что это то, что я открыл) и корректировки имен сборок, я увидел то же, что и вы.

Я исправил это, добавив Public по умолчанию Module Module1,

Другие вопросы по тегам