Проблема с VB.NET CodeDom

У меня проблема с CodeDom при компиляции кода VB. Я получаю сообщение о том, что «Пространство имен или тип, указанный в Imports 'System.Core', не содержит публичных членов или не может быть найден». Это повторяется для каждого импорта внутри кода, который должен быть скомпилирован.

Библиотека компилятора:

Public Class Script
    Private code As String
    Private results As CompilerResults
    Private compiled = False
    Private engine = 1

    Sub setCode(ByVal code As String)
        Me.code = code
        compiled = False
    End Sub
    Sub setCompiler(ByVal cid As Integer)
        If cid > 2 Or cid < 1 Then
            MsgBox("Invalid compiler ID given. Script being ignored...")
        Else
            engine = cid
        End If
    End Sub
    Sub compile()
        'Dim codeProvider As Object
        Dim codeProvider As New VBCodeProvider()
        'If engine = 1 Then
        'codeProvider = New CSharpCodeProvider()
        'Me.code = My.Resources.corecs.ToString() + Me.code
        'ElseIf engine = 2 Then
        'codeProvider = New VBCodeProvider()
        'Me.code = My.Resources.corevb.ToString() + Me.code
        ' End If
        Dim params As New CompilerParameters()
        params.GenerateInMemory = True
        params.TreatWarningsAsErrors = False
        params.WarningLevel = 4
        Dim refs() As String = {"System.dll", "Microsoft.VisualBasic.dll"}
        params.ReferencedAssemblies.AddRange(refs)
        results = codeProvider.CompileAssemblyFromSource(params, Me.code)
        If results.Errors.Count > 0 Then
            MsgBox("Compiler error...")
            For Each errmsg As CompilerError In results.Errors
                MsgBox(errmsg.ErrorText)
            Next
            compiled = False
        Else
            compiled = True
        End If
    End Sub

    Sub runCode(ByVal entrypoint As String)
        Dim mAssembly As System.Reflection.Assembly
        If results.Errors.Count = 0 Then
            mAssembly = results.CompiledAssembly
        Else
            Exit Sub
        End If
        Dim scriptType As Type
        Dim rslt As Object
        Try
            scriptType = mAssembly.GetType("Script")
            rslt = scriptType.InvokeMember(entrypoint, System.Reflection.BindingFlags.InvokeMethod Or System.Reflection.BindingFlags.Public Or System.Reflection.BindingFlags.Static, Nothing, Nothing, Nothing)
        Catch ex As Exception
            MsgBox(ex)
        End Try
    End Sub
End Class

Код, который нужно скомпилировать:

Imports System
Imports System.Core
Imports System.Data
Imports System.Data.DataSetExtensions
Imports System.Drawing
Imports System.Windows.Forms
Imports System.Xml
Imports System.Xml.Linq
Public Class Script
    Public Shared Sub Main()
        MessageBox.Show("Hello")
    End Sub
End Class

Я основывал 90% этого на http://www.codeproject.com/Articles/5472/Compiling-NET-code-on-the-fly


person JohnHoulderUK    schedule 05.10.2013    source источник


Ответы (1)


  Imports System.Core

Непонятно, почему это в вашем исходном коде, оно вам не нужно. Но да, это вызовет ошибку, поскольку ни одна из сборок, которые вы добавили в params.ReferencedAssemblies, не имеет этого пространства имен. Вам также придется добавить System.Core.dll. То же самое для System.Data, для которого требуется ссылка на System.Data.dll. И так далее.

Поищите в своем собственном проекте список ссылок на стандартные сборки каркаса. Проект + Свойства, вкладка Ссылки.

Должен заметить, что это странная неудача. Если компилятор не вызывается с параметром / noconfig, он должен быть автоматически используя файл vbc.rsp, который уже добавляет ссылки для всех общих сборок фреймворка. Я не вижу причины, по которой этого не происходит в вашем случае.

person Hans Passant    schedule 05.10.2013
comment
Фактически, даже сборка System.Core ничего не содержит в пространстве имен System.Core. Так что в этой ошибке есть смысл. - person svick; 06.10.2013