2014-03-13 89 views
2

我有兩個類如何在最終用戶編譯的代碼中加載內部類? (高級)

1-包含兩個元件A的winform主程序:

  • 備註編輯鍵入一些代碼;
  • 按鈕名稱編譯。

enter image description here

最終用戶可以鍵入在備忘錄編輯一些VB.Net代碼,然後對其進行編譯。

2 - 一個簡單的測試類:

代碼:

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

現在我想使用類ClassTest中,將在MemoEdit鍵入的代碼,然後編譯:

enter image description here

當打編譯我收到的錯誤:

enter image description here

的原因是,編譯器無法找到命名空間ClassTest

所以總結:

  • 類ClassTest在主程序
  • 終端用戶創建應該能夠使用它並在運行時創建一個新的程序集

有沒有人知道如何做t請戴上帽子?

非常感謝您的幫助。

代碼在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

這裏是解決方案:如果最終用戶希望使用內部類,他應該用命令

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 
相關問題