㈠ 如何在.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..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.編譯源代碼編譯源代碼相當簡單,只需一條語句就搞定了:=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==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__strMole,string__strMethod,object[]__Arguments){if(!this.IsCompiled||this.theCompiledAssembly==null)thrownewSystem.Exception("腳本還沒有成功編譯");Type__MoleType=this.theCompiledAssembly.GetType(__strMole);if(null==__MoleType)thrownewSystem.Exception(string.Format("指定的類或模塊({0})未定義。",__strMole));MethodInfo__MethodInfo=__MoleType.GetMethod(__strMethod);if(null==__MethodInfo)thrownewSystem.Exception(string.Format("指定的方法({0}::{1})未定義。",__strMole,__strMethod));try{return__MethodInfo.Invoke(null,__Arguments);}catch(TargetParameterCountException){thrownewSystem.Exception(string.Format("指定的方法({0}:{1})參數錯誤。",__strMole,__strMethod));}catch(System.Exceptione){System.Diagnostics.Trace.WriteLine(string.Format("執行({0}:{1})錯誤:{2}",__strMole,__strMethod,e.ToString()));returnnull;}}總結:CodeDom可以很方便的隨時編譯源代碼,並動態執行。雖然作為腳本引擎,它沒有VsaEngine正規和方便,但作為一般應用,也夠用了。並且結合Reflection機制,它的功能比VsaEngine更強大:它可以編譯任何提供CompilerProvider的CLR語言(目前.NET自帶的語言中都有)。當然,它也有一些缺點:它生成的Assembly不能動態卸載。這在一般情況下不成問題,因為一個源代碼只需編譯一次,並載入執行,並不需要動態卸載。假如你需要做腳本編輯器時,就要考慮這個問題,因為有可能一個腳本會因為修修改改而不停的重新編譯,從而造成不停的產生新的Assembly,最後將導致內存被大量佔用。要解決這個問題,需要將編譯器載入到獨立的AppDomain中,通過卸載AppDomain達到卸載所需的Assembly的目的。
㈡ CS里腳本是什麼意思啊
腳本,Script。是使用一種特定的描述性語言,依據一定的格式編寫的可執行文件,又稱作宏或批處理文件。腳本通常可以由應用程序臨時調用並執行。同平時使用的VB、C語言的區別主要是:腳本語法比較簡單,比較容易掌握;腳本與應用程序密切相關,包括相對應用程序自身的功能;腳本一般不具備通用性,所能處理的問題范圍有限。腳本就是源程序,就是代碼程序。
腳本是批處理文件的延伸,是一種純文本保存的程序,一般來說的計算機腳本程序是確定的一系列控制計算機進行運算操作動作的組合,在其中可以實現一定的邏輯分支等。腳本程序相對一般程序開發來說比較接近自然語言,可以不經編譯而是解釋執行,利於快速開發或一些輕量的控制。
腳本是動態程序的一種。動態程序一般有兩種實現方式,另一種是二進制方式。二進制方式是先將我們編寫的程序進行編譯,變成機器可識別的指令代碼,然後再執行。這種編譯好的程序我們只能執行、使用,卻看不到他的程序內容。腳本簡單地說就是一條條的文字命令,這些文字命令是我們可以看到的(如可以用記事本打開查看、編輯),腳本程序在執行時,是由系統的一個解釋器,將其一條條的翻譯成機器可識別的指令,並按程序順序執行。因為腳本在執行時多了一道翻譯的過程,所以它比二進製程序執行效率要稍低一些。
㈢ CS游戲是用什麼語言還是什麼腳本寫的
主引擎是C語言編程,cstrike里是MIC(建築工程電腦模擬軟體)和HVE(CS專用3D圖片拼合)的編程,至於地圖嘛當然是WC做的,另外的一些東西是用NEC遍的附件,太老了,找不到了,再由hl提取。
㈣ vcscript是腳本語言嗎
是腳本語言,但只有ie支持的
㈤ 做腳本一般是用什麼語言程序編寫的可以用C語言編寫嗎
1.腳本語言(javascript,vbscript等)介於html和c,c
,java,c#等編程語言之間。
html通常用於格式化和鏈結文本。而編程語言通常用於向機器發出一系列復雜的指令。
2.腳本語言與編程語言也有很多相似地方,其函數與編程語言比較相象一些,其也涉及到變數。與編程語言之間最大的區別是編程語言的語法和規則更為嚴格和復雜一些.
3.與程序代碼的關系:腳本也是一種語言,其同樣由程序代碼組成。
注:腳本語言一般都有相應的腳本引擎來解釋執行。
他們一般需要解釋器才能運行。javascript,asp,php,perl,nuva都是腳本語言。c/c
編譯、鏈接後,可形成獨立執行的exe文件。
4.腳本語言是一種解釋性的語言,例如vbscript,javascript,installshield
script,actionscript等等,它不象c\c
等可以編譯成二進制代碼,以可執行文件的形式存在.
腳本語言不需要編譯,可以直接用,由解釋器來負責解釋。
5.腳本語言一般都是以文本形式存在,類似於一種命令.
舉個例子說,如果你建立了一個程序,叫aaa.exe,可以打開.aa為擴展名的文件.
你為.aa文件的編寫指定了一套規則(語法),當別人編寫了.aa文件後,你的程序用這種規則來理解編寫人的意圖,並作出回應.那麼,這一套規則就是腳本語言
㈥ 誰幫我使用C語言編寫一個JavaScript腳本解釋器急求
這個比價麻煩1)
JS 語法,至少表達式,變數要有。
2)HTML
document.write
需要寫在HTML對應的位置。