在VB.NET中实现代码动态编译

bucher 2003-06-14 02:13:02
通过.NET的编译系统,可以实现非常复杂的功能,比如动态算法,EXE(DLL)反向生成VB代码之类的

今天很累了,先把我的代码贴上来
如果大家有兴趣,我会考虑写一个专题文章


建立一个窗体
添加一个Textbox,叫做Textbox1
然后在里面输入如下文本
'---剪切线---------------
imports Microsoft.VisualBasic

Public Module Hello
Public Function SayHello()
MsgBox("TEST")
End Function
End Module
'------------------
添加一个CommandButtion,叫做Button1
然后,使用如下源代码
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim myDC As New DynamicCompile
myDC.CompileVB(TextBox1.Text)
End Sub

然后,把下面的代码放到一个Class里面
'------剪切线-----------
Imports System.CodeDom
Imports System.CodeDom.Compiler
Imports System.Reflection

Public Class DynamicCompile
Public Sub CompileVB(ByVal Code As String)
Dim myProvider As New Microsoft.VisualBasic.VBCodeProvider
Dim Compailer As ICodeCompiler = myProvider.CreateCompiler
Dim CompailerParamentes As New CompilerParameters
Dim myAssembly As [Assembly]
Dim mySub As System.Reflection.MethodInfo
Dim MyClass1 As System.Type
With CompailerParamentes
.ReferencedAssemblies.Add("C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\Microsoft.VisualBasic.dll")
.ReferencedAssemblies.Add("C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\mscorlib.dll")
'.OutputAssembly = "temp.dll"
.GenerateInMemory = True
End With

myAssembly = Compailer.CompileAssemblyFromSource(CompailerParamentes, Code).CompiledAssembly
MyClass1 = myAssembly.GetType("Hello")

mySub = MyClass1.GetMethod("SayHello")
mySub.Invoke(MyClass1, Nothing)
End Sub
End Class
'-----------------

完成了,试试看吧

测试环境 :VS.NET 2003+Winxp(sp1)+.NET Framework 1.1
...全文
428 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
W_W_Q 2003-06-16
  • 打赏
  • 举报
回复
还提条件?UP
jjx 2003-06-16
  • 打赏
  • 举报
回复
这不用写了吧
直接研究一下Microosft.vsa命名空间吧
W_W_Q 2003-06-15
  • 打赏
  • 举报
回复
干脆写点东西造福大众吧。
szch 2003-06-15
  • 打赏
  • 举报
回复
up
block 2003-06-15
  • 打赏
  • 举报
回复
能者多劳,支持 bucher(无人永生) 的专题!
bucher 2003-06-15
  • 打赏
  • 举报
回复
因为工作关系,平时都是下班以后才有时间研究这些。
回帖达到30,我就写专题
树莓派 2003-06-14
  • 打赏
  • 举报
回复
写专题!!!
树莓派 2003-06-14
  • 打赏
  • 举报
回复
我试试看,能不能给我一个自动生成exe的代码,在vb6中我是在资源文件(exe)的最后添加数据来实现的。
bucher 2003-06-14
  • 打赏
  • 举报
回复
其实楼上的做法,就是动态的读取数据文件
比直接读取数据文件的好处是少了一个文件

在VB6里面,可以通过动态加载VBS的代码,然后让WindowsScript引擎编译来实现类似的功能。但是VBS的功能十分有限,通常只是用来实现动态算法。

.NET动态编译和动态读取是不一样,它是运行时生成.NET托管代码(通过.NET JIT引擎),和你用VB.NET生成出来的代码是完全一样的,也可以被保存为一个真正的托管EXE(DLL)文件,可以实现任何VB.NET(C#)的功能。在这一点上,理论上你可以自己写一个VB(C#)开发调试环境 :-)
树莓派 2003-06-14
  • 打赏
  • 举报
回复
以前我是在一个固定的程序后面跟一段数据的,然后生成的程序自己去读尾部的数据。
bucher 2003-06-14
  • 打赏
  • 举报
回复
睡觉去了
byebye
bucher 2003-06-14
  • 打赏
  • 举报
回复
生成EXE是可以实现的
不过需要在代码中指定程序的启动模块和入口函数
通常来说可以把这一段写死,让入口函数去掉用一个已知的,自己写的函数即可。

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧