vb.net调用汇编 vbnet imports

VB .NET编程是否可以不依赖.NET Framework这是典型对.net构架不理解造成的!
只要是.net编程,一定使用的是.net类库,必须是同运行版本的.net支持方可运行 。而所谓的vb.net只是说编程的语言层使用的是vb语言而已 。该语言在.net构架下被编译成为IL语言(MSIL,严格说来是IL的一个子集) 。而上层的语言只是产生软件时所使用的一个不同语言规则而已,与IL已经没有任何相关性了 。上层语言无论是C#还是VB,甚至是Java(J#)均只适应编程人员的一个策略 , 与整个构造没有多大的相关性 。
.net的最终目的就是让不同的语言编程人员能协同工作,那么语言在其中的区别没有多大了,所有的运行核心都是由.net完成的,没有必须依赖于.net 。这是没有任何疑问的 。
vb.net就是.net,只是表示用VB语言人的称呼,用C#的则称其为C#.net,但不管是哪种,它是无法脱离.net的 。
vb.net能置入汇编代码不?vb.net只要能调用API函数CallWindowProc就可以 。
汇编码用Byte或Long数组储存,如果下标为0,那么你就可以:
Call CallWindowProc(数组(0),0,0,0,0)
然后把4个0 POP出去,中间是你要执行的汇编码,汇编码最后是
ret等返回的 。
如何在.NET中实现脚本引擎NET本身提供了强大的脚本引擎,可以直接使用.NETCLR的任何编程语言作为脚本语言,如VB.NET、C#、JScript,J#等等 。使用脚本引擎,我们可以动态生成任意表达式、或动态导入任意脚本文件,并在任意时候执行 。经实践发现 , 我们可以使用至少两种不同的方式在.NET中使用脚本引擎:VsaEngine和CodeDom 。其实 , CodeDom不能算是真正的脚本引擎 , 它实际上是编译器 。但是我们完全可以利用CodeDom来模拟脚本引擎 。使用Emit方法也能达到动态生成可执行代码的目的,而且Emit生成的代码不需要编译,因此速度更快 。但是Emit插入的实际上是汇编代码,不能算是脚本语言 。本文介绍如何以CodeDom方式来动态生成可执行代码 。如何在.NET中实现脚本引擎(CodeDom篇)沐枫网志1.构造一个编译器设置编译参数编译参数需要在CompilerParameters设置:CompilerOptions用于设置编译器命令行参数IncludeDebugInformation用于指示是否在内存在生成AssemblyGenerateInMemory用于指示是否在内存在生成AssemblyGenerateExecutable用于指示生成的Assembly类型是exe还是dllOutputAssembly用于指示生成的程序文件名(仅在GenerateInMemory为false的情况)ReferencedAssemblies用于添加引用Assembly例如:theParameters.ReferencedAssemblies.Add("System.dll");创建指定语言的编译器编译需要由指定语言的CodeDomProvider生成 。这里列举一些.NET的CodeDomProvider:vb.netMicrosoft.VisualBasic.VBCodeProviderC#Microsoft.CSharp.CSharpCodeProviderjscriptMicrosoft.JScript.JScriptCodeProviderJ#Microsoft.VJSharp.VJSharpCodeProvider以C#为例 , 要创建C#编译器,代码如下://.NET1.1/1.0ICodeCompilercompiler=newMicrosoft.CSharp.CSharpCodeProvider().CreateCompiler();//.NET2.0ICodeCompilercompiler=(ICodeCompiler)newMicrosoft.CSharp.CSharpCodeProvider();下面是完整的创建编译器的例子://////创建相应脚本语言的编译器///privatevoidcreateCompiler(stringstrLanguage,booldebugMode,stringstrAssemblyFileName){this.theParameters=newCompilerParameters();this.theParameters.OutputAssembly=System.IO.Path.Combine(System.IO.Path.GetTempPath(),strAssemblyFileName ".dll");this.theParameters.GenerateExecutable=false;this.theParameters.GenerateInMemory=true;if(debugMode){this.theParameters.IncludeDebugInformation=true;this.theParameters.CompilerOptions ="/define:TRACE=1/define:DEBUG=1";}else{this.theParameters.IncludeDebugInformation=false;this.theParameters.CompilerOptions ="/define:TRACE=1";}AddReference("System.dll");AddReference("System.Data.dll");AddReference("System.Xml.dll");strLanguage=strLanguage.ToLower();CodeDomProvidertheProvider;if("visualbasic"==strLanguage||"vb"==strLanguage){theProvider=newMicrosoft.VisualBasic.VBCodeProvider();if(debugMode)theParameters.CompilerOptions ="/debug:full/optimize-/optionexplicit /optionstrict /optioncompare:text/imports:Microsoft.VisualBasic,System,System.Collections,System.Diagnostics";elsetheParameters.CompilerOptions ="/optimize/optionexplicit /optionstrict /optioncompare:text/imports:Microsoft.VisualBasic,System,System.Collections,System.Diagnostics";AddReference("Microsoft.VisualBasic.dll");}elseif("jscript"==strLanguage||"js"==strLanguage){theProvider=newMicrosoft.JScript.JScriptCodeProvider();AddReference("Microsoft.JScript.dll");}elseif("csharp"==strLanguage||"cs"==strLanguage||"c#"==strLanguage){theProvider=newMicrosoft.CSharp.CSharpCodeProvider();if(!debugMode)theParameters.CompilerOptions ="/optimize";}//elseif("jsharp"==strLanguage||"vj"==strLanguage||"j#"==strLanguage)//{//theProvider=newMicrosoft.VJSharp.VJSharpCodeProvider();//if(!debugMode)//theParameters.CompilerOptions ="/optimize";//}elsethrownewSystem.Exception("指定的脚本语言不被支持 。");this.theCompiler=theProvider.CreateCompiler();}//////添加引用对象 。//////引用的文件名publicvoidAddReference(string__strAssemblyName){theParameters.ReferencedAssemblies.Add(__strAssemblyName);}注:在.NETFramework2.0中,由于CreateCompiler方法被标记作废 。为避免产生编译警告 , 可直接返回CodeDomProvider作为编译器:this.theCompiler=(ICodeCompiler)theProvider;2.编译源代码编译源代码相当简单 , 只需一条语句就搞定了:CompilerResultscompilerResults=compiler.CompileAssemblyFromSource(this.theParameters,this.SourceText);执行后,可以从compilerResults取得以下内容:NativeCompilerReturnValue编译结果,用于检查是否成功Errors编译时产生的错误和警告信息CompiledAssembly如果编译成功,则返回编译生成的Assembly示例函数://////编译脚本 。编译前将清空以前的编译信息 。///CompilerInfo将包含编译时产生的错误信息 。//////成功时返回True 。不成功为False 。publicboolCompile(){this.theCompilerInfo="";this.isCompiled=false;this.theCompiledAssembly=null;this.theCompilerResults=this.theCompiler.CompileAssemblyFromSource(this.theParameters,this.SourceText);if(this.theCompilerResults.NativeCompilerReturnValue=https://www.04ip.com/post/=0){this.isCompiled=true;this.theCompiledAssembly=this.theCompilerResults.CompiledAssembly;}System.Text.StringBuildercompilerInfo=newSystem.Text.StringBuilder();foreach(CompilerErrorerrinthis.theCompilerResults.Errors){compilerInfo.Append(err.ToString());compilerInfo.Append("/r/n");}theCompilerInfo=compilerInfo.ToString();returnisCompiled;}3.执行代码使用Reflection机制就可以很方便的执行Assembly中的代码 。我们假设编译时使用的脚本代码this.SourceText内容如下:namespacetest{publicclassscript{staticpublicvoidMain(){MessageBox.Show("Hello");}}}则相应的执行代码为:scriptEngine.Invoke("test.script","Main",null);Invoke函数内容://////执行指定的脚本函数(Method) 。///如果指定的类或模块名,以及函数(Method)、或参数不正确,将会产生VsaException/VshException例外 。//////类或模块名///要执行的函数(Method)名字///参数(数组)///返回执行的结果publicobjectInvoke(string__strModule,string__strMethod,object[]__Arguments){if(!this.IsCompiled||this.theCompiledAssembly==null)thrownewSystem.Exception("脚本还没有成功编译");Type__ModuleType=this.theCompiledAssembly.GetType(__strModule);if(null==__ModuleType)thrownewSystem.Exception(string.Format("指定的类或模块({0})未定义 。",__strModule));MethodInfo__MethodInfo=__ModuleType.GetMethod(__strMethod);if(null==__MethodInfo)thrownewSystem.Exception(string.Format("指定的方法({0}::{1})未定义 。",__strModule,__strMethod));try{return__MethodInfo.Invoke(null,__Arguments);}catch(TargetParameterCountException){thrownewSystem.Exception(string.Format("指定的方法({0}:{1})参数错误 。",__strModule,__strMethod));}catch(System.Exceptione){System.Diagnostics.Trace.WriteLine(string.Format("执行({0}:{1})错误:{2}",__strModule,__strMethod,e.ToString()));returnnull;}}总结:CodeDom可以很方便的随时编译源代码,并动态执行 。虽然作为脚本引擎 , 它没有VsaEngine正规和方便,但作为一般应用,也够用了 。并且结合Reflection机制,它的功能比VsaEngine更强大:它可以编译任何提供CompilerProvider的CLR语言(目前.NET自带的语言中都有) 。当然 , 它也有一些缺点:它生成的Assembly不能动态卸载 。这在一般情况下不成问题,因为一个源代码只需编译一次 , 并载入执行,并不需要动态卸载 。假如你需要做脚本编辑器时,就要考虑这个问题,因为有可能一个脚本会因为修修改改而不停的重新编译,从而造成不停的产生新的Assembly,最后将导致内存被大量占用 。要解决这个问题 , 需要将编译器加载到独立的AppDomain中,通过卸载AppDomain达到卸载所需的Assembly的目的 。
VB是一种面向()的可视化程序设计语言 , 采取了()的编程机制VB是一种面向(对象)的可视化程序设计语言,采取了(事件驱动)的编程机制 。VB , 即Visual Basic,是一款由微软开发的包含协助开发环境的事件驱动编程语言 。
Visual Basic 具有“面向对象”特性 。这种“面向对象”的编程方法和传统的全用代码编制程序的方法有很大区别 。“面向对象”的编程方法比传统的编程方法更为简单方便,并且编写出来的程序也会更加稳定 。因此 , “对象”可以被看做 Visual Basic 程序设计的核心 。
扩展资料:
由 Visual Basic 所派生的编程语言
1、VBA
Visual Basic for Applications(VBA):包含在微软的应用程序中(如Microsoft Office),以及类似WordPerfect、Office这样第三方的产品里面 。VBA 这样嵌入在各种应用程序中看起来有些矛盾,但是它的功能和 VB 一样强大 。
2、VBS
VBScript(VBS):是默认的ASP语言,还可以用在Windows脚本编写和网页编码中 。尽管它的语法类似于VB,但是它却是一种完全不同的语言 。VBS 不使用 VB运行库运行 , 而是由Windows脚本主机解释执行 。这两种语言之中的不同点影响ASP网站的表现 。
3、vb.net
Visual Basic .NET(vb .net):当微软准备开发一种新的编程工具的时候,第一决定就是利用 VB 6.0 来进行旧改,或者就是重新组建工程开发新工具 。微软后来开发了 VB 的继任者Visual Basic .NET,同时也是.NET平台的一部分 。vb .net编程语言是一种真正的面向对象编程语言 , 和 VB 并不完全兼容 。
参考资料:百度百科 VB
vb语言的特点VB语言特点:
1、不支持继承
VB 5.0 和 VB 6.0 都是基于对象的编程语言 , 但是不包含继承特性 。VB 中提供了特殊的类的功能,但是还是不能满足程序员的需求 。
2、无原生支持多线程
Visual Basic 对于多线程无原生支持,只能通过Windows API的调用实现,且极其的不稳定 。因为在API创建的线程中,并没有自动初始化运行时库,导致部分的函数无法使用 。一般的 , 在VB6等早期的VB开发环境下,使用API创建线程的目的是完成容易使程序假死的大量数据或者逻辑的计算 。
3、异常处理不完善
Visual Basic 中内置异常处理,即使未写异常处理代码,一旦用户出错也会弹出一个明确写出出错原因对话框 , 接着程序终止 。
扩展资料:
VB的派生语言:
1、VBA
Visual Basic for Applications(VBA):包含在微软的应用程序中(如Microsoft Office),以及类似WordPerfect、Office这样第三方的产品里面 。VBA 这样嵌入在各种应用程序中看起来有些矛盾,但是它的功能和 VB 一样强大 。
2、VBS
VBScript(VBS):是默认的ASP语言,还可以用在Windows脚本编写和网页编码中 。尽管它的语法类似于VB,但是它却是一种完全不同的语言 。VBS 不使用 VB运行库运行,而是由Windows脚本主机解释执行 。这两种语言之中的不同点影响ASP网站的表现 。
3、vb.net
Visual Basic.net(vb.net):当微软准备开发一种新的编程工具的时候 , 第一决定就是利用 VB 6.0 来进行旧改,或者就是重新组建工程开发新工具 。
参考资料来源:百度百科-VB
【vb.net调用汇编 vbnet imports】vb.net调用汇编的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于vbnet imports、vb.net调用汇编的信息别忘了在本站进行查找喔 。

    推荐阅读