如何在最终用户编译的代码中加载内部类? (高级)

时间:2014-03-13 12:59:10

标签: vb.net .net-assembly

我有一个包含两个班级的主程序

1-包含两个元素的winform:

  • 备忘录编辑以输入一些代码;
  • 名为compile的按钮。

enter image description here

最终用户可以在备忘录编辑中键入一些VB.Net代码,然后进行编译。

2 - 一个简单的测试类:

代码:

Public Class ClassTest
    Public Sub New()
        MsgBox("coucou")
    End Sub
End Class

现在我想在将在MemoEdit中输入的代码中使用ClassTest类,然后编译它:

enter image description here

点击编译时我收到错误:

enter image description here

原因是,编译器找不到命名空间ClassTest

总结一下:

  • ClassTest类在主程序
  • 中创建
  • 最终用户应该能够使用它并在运行时创建新程序集

有人知道该怎么做吗?

提前感谢您的帮助。

WinForm的代码:

Public Class Form1
    Private Sub SimpleButtonCompile_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SimpleButtonCompile.Click
        Dim Code As String = Me.MemoEdit1.Text

        Dim CompilerResult As CompilerResults
        CompilerResult = Compile(Code)
    End Sub

    Public Function Compile(ByVal Code As String) As CompilerResults
        Dim CodeProvider As New VBCodeProvider
        Dim CodeCompiler As System.CodeDom.Compiler.CodeDomProvider = CodeDomProvider.CreateProvider("VisualBasic")

        Dim Parameters As New System.CodeDom.Compiler.CompilerParameters
        Parameters.GenerateExecutable = False

        Dim CompilerResult As CompilerResults = CodeCompiler.CompileAssemblyFromSource(Parameters, Code)

        If CompilerResult.Errors.HasErrors Then
            For i = 0 To CompilerResult.Errors.Count - 1
                MsgBox(CompilerResult.Errors(i).ErrorText)
            Next

            Return Nothing
        Else
            Return CompilerResult
        End If
    End Function
End Class

1 个答案:

答案 0 :(得分:1)

以下是解决方案:

如果最终用户想要使用内部类,他应该使用以下命令: Assembly.GetExecutingAssembly

完整的代码将是:

enter image description here

代码:

Imports System.Reflection
Imports System

Public Class EndUserClass
    Public Sub New()

        Dim Assembly As Assembly = Assembly.GetExecutingAssembly
        Dim ClassType As Type = Assembly.GetType(Assembly.GetName().Name & ".ClassTest")
        Dim Instance = Activator.CreateInstance(ClassType)

    End Sub 
End class