代码动态编译的一些问题
各位大虾,小弟最近要使用动态编译生成exe程序,可是发现生成的exe是控制台程序而不是windows窗体应用程序(有用户交互界面的),这样有些用户交互功能无法实现(比如说显示一个窗体等),不知道哪里可以设置生成的应用程序类型的?
Public Shared Sub CreateExe(ByVal exeName As String, ByVal Code As String)
'创建一个编译器.
Dim Comp As VBCodeProvider = New VBCodeProvider()
Dim Parms As CompilerParameters = New CompilerParameters
Parms.GenerateExecutable = True '创建exe文件而不是dll
Parms.OutputAssembly = exeName '产生的应用程序名
Parms.TreatWarningsAsErrors = False'编译器将不会将警告视为错误。
'添加你想引用的所有集合。
Parms.ReferencedAssemblies.Add("System.Windows.Forms.dll")
Parms.ReferencedAssemblies.Add("Microsoft.VisualBasic.dll")
Parms.ReferencedAssemblies.Add("System.dll")
Parms.ReferencedAssemblies.Add("mscorlib.dll")
'定义你要运行的代码。
Dim Executable As CompilerResults = Comp.CompileAssemblyFromSource(Parms, Code)
'如果再有任何错误消息显示。
If Executable.Errors.HasErrors Then
For Each Item As CompilerError In Executable.Errors()
MessageBox.Show(Item.ErrorText)
Next
Else '如果再没有任何错误信息,启动可执行文件。
Process.Start(exeName)
End If
End Sub
这样生成的是控制台程序,如果在Code里面dim frm as new form,dim timer1 as new timer等,用不了。
请问该如何解决?
[最优解释]
这和是否是Console没有关系,关键看你是否用 Application.Run(new Form1()) 启动了窗体。
[其他解释]
如果我Code字符串里的代码如下,那么 Application.Run该用在哪里呢?
Imports System.Windows.Forms
Imports Microsoft.VisualBasic
Imports System
Imports System.Diagnostics
Public Class C_Text
Private Shared Timer As New Timer
Private Shared TimerInterval As Integer = 5000
Public Shared Sub Main()
AddHandler Timer.Tick, AddressOf Timer_Tick
Timer.Interval = TimerInterval
Timer.Start()
End Sub
Private Shared Sub Timer_Tick(ByVal sender As Object, ByVal e As System.EventArgs)
'这里是timer的tick事件,具体代码就不写了
End Sub
End Class
能不能简单的写一下代码?十分感谢!
[其他解释]
Main 里
[其他解释]
fangxinggood您好,我今天按您的提示修改了一下Code代码,如下,可是还是不行(还是黑框一闪就没了)。
Imports System
Imports System.Windows.Forms
Imports Microsoft.VisualBasic
Namespace Text
Public Class C_Text
Public Shared Sub Main()
Application.Run(New MainFrm)
End Sub
End Class
Public Class MainFrm
Inherits Windows.Forms.Form
Private Shared Button1 As Button
Public Sub New()
Button1.Text = "Text"
Button1.Top = 100 : Button1.Left = 100
AddHandler Button1.Click, AddressOf Button1_Click
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
MsgBox("Text")
End Sub
End Class
End Namespace
这样应该没错了吧?可是窗体还是无法显示,请问哪里出错了?