2011-04-21 46 views
0

對不起我的英語,我沒有很好地闡述......我需要在內存中編譯程序集,可以編譯另一個程序集。有一個按鈕的表單。這裏是形式從另一個compcc組裝彙編程序集

Imports System 
Imports System.Threading 
Imports System.CodeDom 
Imports System.CodeDom.Compiler 
Imports System.Collections 
Imports System.ComponentModel 
Imports System.Diagnostics 
Imports System.Drawing 
Imports System.IO 
Imports System.Windows.Forms 
Imports Microsoft.VisualBasic 
Public Class testtwo 
    Shared str_tb As String 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     Call openkubik() 
    End Sub 
    Private Sub openkubik() 
     Dim th As Thread = New Thread(AddressOf sborkakub) 
     th.Start() 
    End Sub 
    Private Sub sborkakub() 
     Dim evi As System.Security.Policy.Evidence = AppDomain.CurrentDomain.Evidence 
     Dim assemblyDomain As AppDomain 
     Dim assemblyDomainSetup As AppDomainSetup = New AppDomainSetup 
     assemblyDomainSetup.ApplicationBase = System.Environment.CurrentDirectory 
     assemblyDomainSetup.DisallowBindingRedirects = False 
     assemblyDomainSetup.DisallowCodeDownload = True 
     assemblyDomainSetup.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile 
     assemblyDomainSetup.LoaderOptimization = LoaderOptimization.MultiDomainHost 
     assemblyDomain = AppDomain.CreateDomain("AssemblyDomain", evi, assemblyDomainSetup) 
     assemblyDomain.DoCallBack(AddressOf assamblykub) 
     Call assamblykub() 
    End Sub 
    Private Shared Sub assamblykub() 
     Call createtext() 
     Dim objCodeCompiler As System.CodeDom.Compiler.CodeDomProvider = System.CodeDom.Compiler.CodeDomProvider.CreateProvider("VB") 
     Dim objCompilerParameters As New System.CodeDom.Compiler.CompilerParameters() 
     For Each asm In AppDomain.CurrentDomain.GetAssemblies() 
      objCompilerParameters.ReferencedAssemblies.Add(asm.Location) 
     Next 
     objCompilerParameters.CompilerOptions = "/target:winexe" 
     objCompilerParameters.GenerateExecutable = True 
     objCompilerParameters.GenerateInMemory = True 
     objCompilerParameters.IncludeDebugInformation = False 
     Dim objCompileResults As System.CodeDom.Compiler.CompilerResults = objCodeCompiler.CompileAssemblyFromSource(objCompilerParameters, str_tb) 
     If objCompileResults.Errors.HasErrors Then 
      MessageBox.Show(String.Format("Error: Line>{0}, {1} # {2}", objCompileResults.Errors(0).Line, objCompileResults.Errors(0).ErrorText, objCompileResults.Errors(0).ErrorNumber)) 
      Return 
     End If 
     Dim objAssembly As System.Reflection.Assembly = objCompileResults.CompiledAssembly 
     Dim objTheClass As Object = objAssembly.CreateInstance("MainClass") 
     If objTheClass Is Nothing Then 
      MsgBox("Can't load class...") 
      Exit Sub 
     End If 
     Try 
      objTheClass.GetType.InvokeMember("Main", System.Reflection.BindingFlags.InvokeMethod, _ 
      Nothing, objTheClass, Nothing) 
     Catch ex As Exception 
      MsgBox("Error:" & ex.Message) 
     End Try 
    End Sub 
    Private Shared Sub createtext() 
     Dim tempfile As New IO.FileStream(Application.StartupPath & "/temp_open.txt", IO.FileMode.Open, IO.FileAccess.Read) 
     Dim tempfilesr As New IO.StreamReader(tempfile, System.Text.Encoding.GetEncoding(1251)) 
     str_tb = tempfilesr.ReadToEnd 
     tempfilesr.Close() 
     tempfile.Close() 
     tempfile = Nothing 
     tempfilesr = Nothing 
    End Sub 
End Class 

的代碼和「temp_open.txt」文件的代碼

Imports System 
Imports System.Diagnostics 
Imports System.Windows.Forms 
Imports System.Windows 
Imports Microsoft.VisualBasic 
Imports System.Threading 
Imports System.IO 
    Public Class MainClass 
Inherits MarshalByRefObject 
    Public Shared Sub Main() 
    Dim tf As New testtwo 
    application.run(tf) 
    End Sub 
End Class 
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _ 
Partial Class testtwo 
    Inherits System.Windows.Forms.Form 
    <System.Diagnostics.DebuggerNonUserCode()> _ 
    Protected Overrides Sub Dispose(ByVal disposing As Boolean) 
     Try 
      If disposing AndAlso components IsNot Nothing Then 
     components.Dispose() 
      End If 
     Finally 
      MyBase.Dispose(disposing) 
     End Try 
    End Sub 
     Private components As System.ComponentModel.IContainer 
    <System.Diagnostics.DebuggerStepThrough()> _ 
    Private Sub InitializeComponent() 
     Me.Button1 = New System.Windows.Forms.Button 
     Me.SuspendLayout() 
     Me.Button1.Location = New System.Drawing.Point(114, 40) 
     Me.Button1.Name = "Button1" 
     Me.Button1.Size = New System.Drawing.Size(231, 39) 
     Me.Button1.TabIndex = 0 
     Me.Button1.Text = "Button1" 
     Me.Button1.UseVisualStyleBackColor = True 
     Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) 
     Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font 
     Me.ClientSize = New System.Drawing.Size(465, 133) 
     Me.Controls.Add(Me.Button1) 
     Me.Name = "test" 
     Me.Text = "test" 
     Me.ResumeLayout(False) 
    End Sub 
     Friend WithEvents Button1 As System.Windows.Forms.Button 
End Class 
Public Class testtwo 
    Shared str_tb As String 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     Call openkubik() 
    End Sub 
    Private Sub openkubik() 
     Dim th As Thread = New Thread(AddressOf sborkakub) 
     th.Start() 
    End Sub 
    Private Sub sborkakub() 
     Dim evi As System.Security.Policy.Evidence = AppDomain.CurrentDomain.Evidence 
     Dim assemblyDomain As AppDomain 
     Dim assemblyDomainSetup As AppDomainSetup = New AppDomainSetup 
     assemblyDomainSetup.ApplicationBase = System.Environment.CurrentDirectory 
     assemblyDomainSetup.DisallowBindingRedirects = False 
     assemblyDomainSetup.DisallowCodeDownload = True 
     assemblyDomainSetup.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile 
     assemblyDomainSetup.LoaderOptimization = LoaderOptimization.MultiDomainHost 
     assemblyDomain = AppDomain.CreateDomain("AssemblyDomain", evi, assemblyDomainSetup) 
     assemblyDomain.DoCallBack(AddressOf assamblykub) 
    End Sub 
    Private Shared Sub assamblykub() 
     Call createtext() 
     Dim objCodeCompiler As System.CodeDom.Compiler.CodeDomProvider = System.CodeDom.Compiler.CodeDomProvider.CreateProvider("VB") 
     Dim objCompilerParameters As New System.CodeDom.Compiler.CompilerParameters() 
     dim asm as System.Reflection.Assembly 
    For Each asm In AppDomain.CurrentDomain.GetAssemblies() 
      objCompilerParameters.ReferencedAssemblies.Add(asm.Location) 
     Next 
     'objCompilerParameters.OutputAssembly = "res1" 
     objCompilerParameters.CompilerOptions = "/target:winexe" 
     objCompilerParameters.GenerateExecutable = True 
     objCompilerParameters.GenerateInMemory = True 
     objCompilerParameters.IncludeDebugInformation = False 
     Dim objCompileResults As System.CodeDom.Compiler.CompilerResults = objCodeCompiler.CompileAssemblyFromSource(objCompilerParameters, str_tb) 
     If objCompileResults.Errors.HasErrors Then 
      MessageBox.Show(String.Format("Error: Line>{0}, {1} # {2}", objCompileResults.Errors(0).Line, objCompileResults.Errors(0).ErrorText, objCompileResults.Errors(0).ErrorNumber)) 
      Return 
     End If 
     Dim objAssembly As System.Reflection.Assembly = objCompileResults.CompiledAssembly 
     Dim objTheClass As Object = objAssembly.CreateInstance("MainClass") 
     If objTheClass Is Nothing Then 
      MsgBox("Can't load class...") 
      Exit Sub 
     End If 
     Try 
      objTheClass.GetType.InvokeMember("Main", System.Reflection.BindingFlags.InvokeMethod, _ 
      Nothing, objTheClass, Nothing) 
     Catch ex As Exception 
      MsgBox("Error:" & ex.Message) 
     End Try 
    End Sub 
    Private Shared Sub createtext() 
     Dim tempfile As New IO.FileStream(Application.StartupPath & "/temp_open.txt", IO.FileMode.Open, IO.FileAccess.Read) 
     Dim tempfilesr As New IO.StreamReader(tempfile, System.Text.Encoding.GetEncoding(1251)) 
     str_tb = tempfilesr.ReadToEnd 
     tempfilesr.Close() 
     tempfile.Close() 
     tempfile = Nothing 
     tempfilesr = Nothing 
    End Sub 
End Class 

,當我在第一種形式單擊Button - >出現第二種形式。但是當我在第二個窗體中單擊按鈕1時,我有一個FileNotFound異常。我究竟做錯了什麼? 有一個很有趣的時刻。這個例子有一些變化在C#中工作(http://stackoverflow.com/questions/5729403/compilling-assembly-from-the-other-just-compilled-assembly)也許有人誰不會vb和c#,並幫助我理解兩個例子之間的區別?

回答

0

您是否嘗試用assamblykub函數的簡單調用替換assemblyDomain.DoCallBack(AddressOf assamblykub)函數?

+0

是的,我有,我有同樣的問題,我有添加新的AppDomain創建時。異常「vbc:命令行(0,0):錯誤BC2006:選項'r'需要':'」 – 2011-04-21 09:10:42

+1

問題出在 昏暗asm作爲System.Reflection.Assembly For Each asm在AppDomain.CurrentDomain.GetAssemblies ) objCompilerParameters.ReferencedAssemblies.Add(asm.Location) 接下來 必須 'objCompilerParameters.ReferencedAssemblies.Add( 「System.dll中」)' 等 安東謝苗諾夫,謝謝大家幫忙 – 2011-04-21 09:50:17