从另一个刚刚编译的程序集编译程序集 [英] compiling assembly from the other just compiled assembly

查看:40
本文介绍了从另一个刚刚编译的程序集编译程序集的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要在内存中编译程序集,可以编译另一个.有一个带有一个按钮的表单.这是表格的代码

I need to compile assembly in memory, that can compile another one. There is a form with one button. Here is a code of the form

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"文件的代码

And the code of "temp_open.txt" file

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

当我在第一种形式中单击 Button1 -> 出现第二种形式.但是当我在第二种形式中单击按钮 1 时,我有一个 FileNotFound 异常.我究竟做错了什么?有一个有趣的时刻.此示例在 C# 中进行了一些更改(http://stackoverflow.com/questions/5729403/compilling-assembly-from-the-other-just-compilled-assembly) 也许有人懂 vb 和 c# 并帮助我理解两个例子之间的区别?

When I click Button1 in first form -> appears second form. but when I click Button 1 in the second form I have an FileNotFound Exception. What am I doing wrong? There is an interesting moment. This example with some changes work in C#(http://stackoverflow.com/questions/5729403/compilling-assembly-from-the-other-just-compilled-assembly) Maybe There are people who knows vb and c# and helps me to understand differences between two examples?

推荐答案

您是否尝试将 assemblyDomain.DoCallBack(AddressOf assamblykub) 替换为 assamblykub 函数的简单调用?

Did you tried to replace assemblyDomain.DoCallBack(AddressOf assamblykub) with simple call of assamblykub function ?

这篇关于从另一个刚刚编译的程序集编译程序集的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆