一、Emit概述
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:申請域名、網(wǎng)頁空間、營銷軟件、網(wǎng)站建設(shè)、廉江網(wǎng)站維護(hù)、網(wǎng)站推廣。
Emit,可以稱為發(fā)出或者產(chǎn)生。在Framework中,與Emit相關(guān)的類基本都存在于System.Reflection.Emit命名空間下??梢奅mit是作為反射的一個元素存在的。說道反射,大家應(yīng)該都不陌生,它允許我們查看程序集的元素?fù)?jù),從而取得形如程序集包含哪些類型,類型包含哪些方法等等大量的信息。但是反射也僅能夠‘看’,而Emit則可以在運(yùn)行時動態(tài)生成代碼。接下來就來看看如何用Emit生成代碼。
二、動態(tài)生成代碼
首先需要明確的是這里的代碼并不是我們時常提到的C#,VB等源代碼,而是IL代碼。既然是IL代碼,那學(xué)習(xí)Emit是不是要先對IL很熟悉呢?誠然,熟悉IL代碼對Emit學(xué)習(xí)會大有幫助,但是不懂也沒關(guān)系,因為IL和高級語言一樣,也是有一些相對固定的語法結(jié)構(gòu)組成,不可能在一個IL程序里表述if是一個樣子而到另一個程序卻變成了另一個樣子。所以只要多用,多記,很快就能掌握這些東西。
其次如C#,VB等程序會包含程序集,模塊,類,方法,屬性等元素一樣,Emit生成的代碼也包括這些元素。以下介紹Emit生成代碼的基本流程:
1.構(gòu)建程序集
在創(chuàng)建程序集之前,我們先要為它取個名字。
var asmName = new AssemblyName("Test");
AssemblyName位于System.Reflection命名空間下,它代表程序集的名稱。
然后我們就可以用上面的名字來創(chuàng)建一個程序集了:
var asmBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.RunAndSave);
AssemblyBuilderAccess.ReflectionOnly:
DefineDynamicAssembly有很多重載,比如上面的例子可以添加第三個參數(shù)用于作為生成的程序集要存放到的目錄。關(guān)于其他重載形式,大家可以查閱MSDN。這里重點說說AssemblyBuilderAccess這個枚舉。
它有以下幾個值:
AssemblyBuilderAccess.ReflectionOnly:表示動態(tài)程序集只能用于反射獲取元素?fù)?jù)用,不能執(zhí)行。
AssemblyBuilderAccess.Run:表示動態(tài)程序集是用于執(zhí)行的。 AssemblyBuilderAccess.Save:表示動態(tài)程序集會被保存到磁盤上,不能立即執(zhí)行。 AssemblyBuilderAccess.RunAndSave:表示動態(tài)程序集會被保存至磁盤并能立即執(zhí)行。
2.創(chuàng)建模塊
創(chuàng)建程序集后,就需要為程序集添加模塊了,我們可以如下定義一個模塊:
var mdlBldr = asmBuilder.DefineDynamicModule("Main", "Main.dll");
如果想把動態(tài)生成的程序集保存至磁盤(如本例),定義模塊時模塊所在文件的名稱一定要和保存程序集(后面會提到)時提供的文件名稱一樣。
3.定義類
有了前面的準(zhǔn)備工作,我們開始定義我們的類型:
var typeBldr = mdlBldr.DefineType("Hello",TypeAttributes.Public);
DefineType還可以設(shè)置要定義的類的基類,要實現(xiàn)的接口等等。
4.定義類成員(方法,屬性等等)
既然有了類,下面我們就為它添加一個SayHello方法吧:
var methodBldr = typeBldr.DefineMethod(
"SayHello",
MethodAttributes.Public,
null,//return type
null//parameter type );
該方法的原型為public void SayHell();
方法簽名已經(jīng)生成好了,但方法還缺少實現(xiàn)。在生成方法的實現(xiàn)前,必須提及一個很重要的概念:evaluation stack。在.Net下基本所有的操作都是通過入棧出棧完成的。這個棧就是evaluation stack。比如要計算兩個數(shù)(a,b)的和,首先要將a放入evaluation stack中,然后再將b也放入棧中,最后執(zhí)行加法時將彈出棧頂?shù)膬蓚€元素也就是a和b,相加再將結(jié)果推送至棧頂。
Console.WriteLine("Hello,World")可以用Emit這樣生成:
var il = methodBldr.GetILGenerator();//獲取il生成器
il.Emit(OpCodes.Ldstr,"Hello, World");
il.Emit(OpCodes.Call,typeof(Console).GetMethod("WriteLine",new Type[]{typeof(string)}));
il.Emit(OpCodes.Ret);
OpCodes枚舉定義了所有可能的操作,這里用到了:
ldStr:加載一個字符串到evaluation stack。
Call:調(diào)用方法。
Ret:返回,當(dāng)evaluation stack有值時會返回棧頂值。
完成上面的步驟,一個類型好像就已經(jīng)完成了。事實上卻還沒有,最后我們還必須顯示的調(diào)用CreateType來完成類型的創(chuàng)建。
NET本身提供了強(qiáng)大的腳本引擎,可以直接使用.NETCLR的任何編程語言作為腳本語言,如VB.NET、C#、JScript,J#等等。使用腳本引擎,我們可以動態(tài)生成任意表達(dá)式、或動態(tài)導(dǎo)入任意腳本文件,并在任意時候執(zhí)行。經(jīng)實踐發(fā)現(xiàn),我們可以使用至少兩種不同的方式在.NET中使用腳本引擎:VsaEngine和CodeDom。其實,CodeDom不能算是真正的腳本引擎,它實際上是編譯器。但是我們完全可以利用CodeDom來模擬腳本引擎。使用Emit方法也能達(dá)到動態(tài)生成可執(zhí)行代碼的目的,而且Emit生成的代碼不需要編譯,因此速度更快。但是Emit插入的實際上是匯編代碼,不能算是腳本語言。本文介紹如何以CodeDom方式來動態(tài)生成可執(zhí)行代碼。如何在.NET中實現(xiàn)腳本引擎(CodeDom篇)沐楓網(wǎng)志1.構(gòu)造一個編譯器設(shè)置編譯參數(shù)編譯參數(shù)需要在CompilerParameters設(shè)置:CompilerOptions用于設(shè)置編譯器命令行參數(shù)IncludeDebugInformation用于指示是否在內(nèi)存在生成AssemblyGenerateInMemory用于指示是否在內(nèi)存在生成AssemblyGenerateExecutable用于指示生成的Assembly類型是exe還是dllOutputAssembly用于指示生成的程序文件名(僅在GenerateInMemory為false的情況)ReferencedAssemblies用于添加引用Assembly例如:theParameters.ReferencedAssemblies.Add("System.dll");創(chuàng)建指定語言的編譯器編譯需要由指定語言的CodeDomProvider生成。這里列舉一些.NET的CodeDomProvider:vb.netMicrosoft.VisualBasic.VBCodeProviderC#Microsoft.CSharp.CSharpCodeProviderjscriptMicrosoft.JScript.JScriptCodeProviderJ#Microsoft.VJSharp.VJSharpCodeProvider以C#為例,要創(chuàng)建C#編譯器,代碼如下://.NET1.1/1.0ICodeCompilercompiler=newMicrosoft.CSharp.CSharpCodeProvider().CreateCompiler();//.NET2.0ICodeCompilercompiler=(ICodeCompiler)newMicrosoft.CSharp.CSharpCodeProvider();下面是完整的創(chuàng)建編譯器的例子://////創(chuàng)建相應(yīng)腳本語言的編譯器///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方法被標(biāo)記作廢。為避免產(chǎn)生編譯警告,可直接返回CodeDomProvider作為編譯器:this.theCompiler=(ICodeCompiler)theProvider;2.編譯源代碼編譯源代碼相當(dāng)簡單,只需一條語句就搞定了:CompilerResultscompilerResults=compiler.CompileAssemblyFromSource(this.theParameters,this.SourceText);執(zhí)行后,可以從compilerResults取得以下內(nèi)容:NativeCompilerReturnValue編譯結(jié)果,用于檢查是否成功Errors編譯時產(chǎn)生的錯誤和警告信息CompiledAssembly如果編譯成功,則返回編譯生成的Assembly示例函數(shù)://////編譯腳本。編譯前將清空以前的編譯信息。///CompilerInfo將包含編譯時產(chǎn)生的錯誤信息。//////成功時返回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.執(zhí)行代碼使用Reflection機(jī)制就可以很方便的執(zhí)行Assembly中的代碼。我們假設(shè)編譯時使用的腳本代碼this.SourceText內(nèi)容如下:namespacetest{publicclassscript{staticpublicvoidMain(){MessageBox.Show("Hello");}}}則相應(yīng)的執(zhí)行代碼為:scriptEngine.Invoke("test.script","Main",null);Invoke函數(shù)內(nèi)容://////執(zhí)行指定的腳本函數(shù)(Method)。///如果指定的類或模塊名,以及函數(shù)(Method)、或參數(shù)不正確,將會產(chǎn)生VsaException/VshException例外。//////類或模塊名///要執(zhí)行的函數(shù)(Method)名字///參數(shù)(數(shù)組)///返回執(zhí)行的結(jié)果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})參數(shù)錯誤。",__strModule,__strMethod));}catch(System.Exceptione){System.Diagnostics.Trace.WriteLine(string.Format("執(zhí)行({0}:{1})錯誤:{2}",__strModule,__strMethod,e.ToString()));returnnull;}}總結(jié):CodeDom可以很方便的隨時編譯源代碼,并動態(tài)執(zhí)行。雖然作為腳本引擎,它沒有VsaEngine正規(guī)和方便,但作為一般應(yīng)用,也夠用了。并且結(jié)合Reflection機(jī)制,它的功能比VsaEngine更強(qiáng)大:它可以編譯任何提供CompilerProvider的CLR語言(目前.NET自帶的語言中都有)。當(dāng)然,它也有一些缺點:它生成的Assembly不能動態(tài)卸載。這在一般情況下不成問題,因為一個源代碼只需編譯一次,并載入執(zhí)行,并不需要動態(tài)卸載。假如你需要做腳本編輯器時,就要考慮這個問題,因為有可能一個腳本會因為修修改改而不停的重新編譯,從而造成不停的產(chǎn)生新的Assembly,最后將導(dǎo)致內(nèi)存被大量占用。要解決這個問題,需要將編譯器加載到獨立的AppDomain中,通過卸載AppDomain達(dá)到卸載所需的Assembly的目的。
c# 是 java 和 C 混合的產(chǎn)物。
.NET Framework 類庫是一個由 Microsoft .NET Framework SDK 中包含的類、接口和值類型組成的庫。該庫提供對系統(tǒng)功能的訪問,是建立 .NET Framework 應(yīng)用程序、組件和控件的基礎(chǔ)。
DotNet FrameWork所有的類都包含在命名空間里面。
命名空間
.NET Framework 類庫提供下列命名空間:
▲Microsoft.CSharp
包含支持用 C# 語言進(jìn)行編譯和代碼生成的類。
▲Microsoft.JScript
包含支持用 JScript 語言進(jìn)行編譯和代碼生成的類。
▲Microsoft.VisualBasic
包含支持用 Visual Basic .NET 語言進(jìn)行編譯和代碼生成的類。
▲Microsoft.Vsa
包含使您可以將 .NET Framework 腳本引擎的腳本集成到應(yīng)用程序中以及在運(yùn)行時編譯和執(zhí)行代碼的接口。
▲Microsoft.Win32
提供兩種類型的類:處理由操作系統(tǒng)引發(fā)的事件的類和對系統(tǒng)注冊表進(jìn)行操作的類。
▲System
包含用于定義常用值和引用數(shù)據(jù)類型、事件和事件處理程序、接口、屬性和處理異常的基礎(chǔ)類和基類。
其他類提供支持下列操作的服務(wù):數(shù)據(jù)類型轉(zhuǎn)換,方法參數(shù)操作,數(shù)學(xué)計算,遠(yuǎn)程和本地程序調(diào)用,應(yīng)用程序環(huán)境管理以及對托管和非托管應(yīng)用程序的監(jiān)管。
▲System.CodeDom
包含可用于表示源代碼文檔的元素和結(jié)構(gòu)的類。這些元素可用于建立源代碼文檔的結(jié)構(gòu)。通過使用 ▲System.CodeDom.Compiler 命名空間所提供的功能,可以將源代碼文檔輸出為用受支持的語言編寫的源代碼。
▲System.CodeDom.Compiler
包含用于管理用受支持的編程語言生成和編譯源代碼的類型。每個代碼生成器可根據(jù)“代碼文檔對象模型”(CodeDOM) 源代碼模型的結(jié)構(gòu)(由 ▲System.CodeDom 命名空間所提供的元素組成),用特定的某種編程語言生成源代碼。
▲System.Collections
包含定義各種對象集合(如列表、隊列、位數(shù)組、哈希表和字典)的接口和類。
▲System.Collections.Specialized
包含專用的強(qiáng)類型集合;例如,鏈接表詞典、位向量以及只包含字符串的集合。
▲System.ComponentModel
提供用于實現(xiàn)組件和控件的運(yùn)行時和設(shè)計時行為的類。此命名空間包括用于屬性和類型轉(zhuǎn)換器的實現(xiàn)、數(shù)據(jù)源綁定和組件授權(quán)的基類和接口。
▲System.ComponentModel.Design
包含可由開發(fā)人員用來生成自定義設(shè)計時組件行為和在設(shè)計時配置組件的用戶界面的類。設(shè)計時環(huán)境提供了使開發(fā)人員能夠安排組件并配置它們的屬性的系統(tǒng)。
▲System.ComponentModel.Design.Serialization
提供支持在設(shè)計時自定義和控制序列化的類型。
▲System.Configuration
提供使您可以以編程方式訪問 .NET Framework 配置設(shè)置和處理配置文件(.config 文件)中的錯誤的類和接口。
▲System.Configuration.Assemblies
包含用于配置程序集的類。
▲System.Configuration.Install
提供使您可以為自己的組件編寫自定義安裝程序的類。Installer 類是 .NET Framework 中所有自定義安裝程序的基類。
▲System.Data
基本上由構(gòu)成 ADO.NET 結(jié)構(gòu)的類組成。ADO.NET 結(jié)構(gòu)使您可以生成可用于有效管理多個數(shù)據(jù)源中的數(shù)據(jù)的組件。在斷開連接的方案(如 Internet)中,ADO.NET 提供了一些可以在多層系統(tǒng)中請求、更新和協(xié)調(diào)數(shù)據(jù)的工具。ADO.NET 結(jié)構(gòu)也可以在客戶端應(yīng)用程序(如 Windows 窗體)或 ASP.NET 創(chuàng)建的 HTML 頁中實現(xiàn)。
▲System.Data.Common
包含由 .NET Framework 數(shù)據(jù)提供程序共享的類。.NET Framework 數(shù)據(jù)提供程序描述用于在托管空間中訪問數(shù)據(jù)源(如數(shù)據(jù)庫)的類的集合。
▲System.Data.Odbc
封裝 ODBC .NET Framework 數(shù)據(jù)提供程序。.NET Framework 數(shù)據(jù)提供程序描述用于在托管空間中訪問數(shù)據(jù)源(如數(shù)據(jù)庫)的類的集合。通過使用 OdbcDataAdapter 類,可以填充駐留在內(nèi)存中的 DataSet,使用它可以查詢和更新數(shù)據(jù)源。
有關(guān)如何使用此命名空間的其他信息,請參見 OdbcDataReader、OdbcCommand 和 OdbcConnection 類。
注意:該命名空間僅在 .NET Framework 1.1 版中受支持。
▲System.Data.OleDb
封裝 OLE DB .NET Framework 數(shù)據(jù)提供程序。OLE DB .NET Framework 數(shù)據(jù)提供程序描述了用于在托管空間中訪問 OLE DB 數(shù)據(jù)源的類集合。
▲System.Data.OracleClient
封裝 Oracle .NET Framework 數(shù)據(jù)提供程序。Oracle .NET Framework 數(shù)據(jù)提供程序描述了用于在托管空間中訪問 Oracle 數(shù)據(jù)源的類集合。
注意:該命名空間僅在 .NET Framework 1.1 版中受支持。
▲System.Data.SqlClient
封裝 SQL Server .NET Framework 數(shù)據(jù)提供程序。SQL Server .NET Framework 數(shù)據(jù)提供程序描述了用于在托管空間中訪問 SQL Server 數(shù)據(jù)庫的類集合。
▲System.Data.SqlServerCE
描述可用于在托管環(huán)境下從基于 Windows CE 的設(shè)備訪問 SQL Server CE 中的數(shù)據(jù)庫的類集合。通過此命名空間,可以在一個設(shè)備上創(chuàng)建 SQL Server CE 數(shù)據(jù)庫,并且可以與另一個設(shè)備或遠(yuǎn)程服務(wù)器上的 SQL Server 數(shù)據(jù)庫建立連接。
注意:該命名空間僅在 .NET Framework 1.1 版中受支持。
▲System.Data.SqlTypes
提供用于 SQL Server 中的本機(jī)數(shù)據(jù)類型的類。這些類提供了其他數(shù)據(jù)類型的更安全、更快速的替代物。使用此命名空間中的類有助于防止在可能發(fā)生精度損失的情況中出現(xiàn)的類型轉(zhuǎn)換錯誤。由于其他數(shù)據(jù)類型與 SqlTypes 在后臺相互轉(zhuǎn)換,因此在此命名空間內(nèi)顯式創(chuàng)建和使用對象同樣會產(chǎn)生較快的代碼。
▲System.Diagnostics
提供允許與系統(tǒng)進(jìn)程、事件日志和性能計數(shù)器進(jìn)行交互的類。此命名空間還提供了使您可以調(diào)試應(yīng)用程序和跟蹤代碼執(zhí)行的類。有關(guān)更多信息,請參見 Trace 和 Debug 類。
▲System.Diagnostics.SymbolStore
提供使您可以讀取和寫入調(diào)試符號信息(如 Microsoft 中間語言 (MSIL) 映射的源行)的類。面向 .NET Framework 的編譯器可以將調(diào)試符號信息存儲到程序員的數(shù)據(jù)庫 (PDB) 文件中。調(diào)試器和代碼分析器工具可以在運(yùn)行時讀取調(diào)試符號信息。
▲System.DirectoryServices
提供從托管代碼輕松訪問 Active Directory 的方法。此命名空間包含兩個組件類:DirectoryEntry 和 DirectorySearcher。這兩個類使用 Active Directory 服務(wù)接口 (ADSI) 技術(shù)。ADSI 是由 Microsoft 提供的一組接口,是一種可靈活處理各種網(wǎng)絡(luò)提供程序的工具。ADSI 使管理員能夠相對輕松地查找和管理網(wǎng)絡(luò)資源,不論網(wǎng)絡(luò)規(guī)模有多大。
▲System.Drawing
提供對 GDI 基本圖形功能的訪問?!鳶ystem.Drawing.Drawing2D、▲System.Drawing.Imaging 和 ▲System.Drawing.Text 命名空間提供了更高級的功能。
▲System.Drawing.Design
包含擴(kuò)展設(shè)計時用戶界面 (UI) 邏輯和繪制的類??梢赃M(jìn)一步擴(kuò)展此設(shè)計時功能來創(chuàng)建以下對象:自定義工具箱項,類型特定的值編輯器或類型轉(zhuǎn)換器,其中類型特定的值編輯器用于編輯和以圖形方式表示所支持的類型的值;類型轉(zhuǎn)換器用于在特定的類型之間轉(zhuǎn)換值。此命名空間提供了開發(fā)設(shè)計時用戶界面擴(kuò)展的基本框架。
▲System.Drawing.Drawing2D
提供高級的二維和向量圖形功能。此命名空間包括漸變畫筆、Matrix 類(用于定義幾何轉(zhuǎn)換)和 GraphicsPath 類。
▲System.Drawing.Imaging
提供高級的 GDI 圖像處理功能?;緢D形功能由 ▲System.Drawing 命名空間提供。
▲System.Drawing.Printing
提供與打印相關(guān)的服務(wù)。通常情況下,您可以創(chuàng)建 PrintDocument 類的實例,設(shè)置描述打印內(nèi)容的屬性,然后調(diào)用 Print 方法實際打印文檔。
▲System.Drawing.Text
提供高級的 GDI 版式功能。基本圖形功能由 ▲System.Drawing 命名空間提供。此命名空間中的類使用戶可以創(chuàng)建和使用字體集合。
▲System.EnterpriseServices
為企業(yè)級應(yīng)用程序提供重要的基礎(chǔ)結(jié)構(gòu)。COM 為企業(yè)級環(huán)境中部署的組件編程模型提供服務(wù)結(jié)構(gòu)。此命名空間為 .NET Framework 對象提供了對 COM 服務(wù)的訪問,從而使 .NET Framework 對象更適用于企業(yè)級應(yīng)用程序。
▲System.EnterpriseServices.CompensatingResourceManager
提供使您可以在托管代碼中使用補(bǔ)償資源管理器 (CRM) 的類。CRM 是由 COM 提供的一項服務(wù),它使您可以在 Microsoft 分布式事務(wù)處理協(xié)調(diào)器 (DTC) 事務(wù)中包括非事務(wù)性對象。雖然 CRM 不提供完整資源管理器的功能,但它們卻通過恢復(fù)日志提供事務(wù)性原子性(全有或全無行為)和持久性。
▲System.EnterpriseServices.Internal
提供 COM 服務(wù)的基礎(chǔ)結(jié)構(gòu)支持。此命名空間中的類和接口專門用于支持從非托管 COM 類調(diào)入 ▲System.EnterpriseServices。
▲System.Globalization
包含定義區(qū)域性相關(guān)信息的類,這些信息包括語言、國家/地區(qū)、正在使用的日歷、日期的格式模式、貨幣、數(shù)字以及字符串的排序順序。這些類對于編寫全球化(國際化)應(yīng)用程序很有用。
▲System.IO
包含允許對數(shù)據(jù)流和文件進(jìn)行同步和異步讀寫的類型。
▲System.IO.IsolatedStorage
包含允許創(chuàng)建和使用獨立存儲區(qū)的類型。通過使用這些存儲區(qū),可以讀寫入受信任程度較小的代碼無法訪問的數(shù)據(jù),并且可以防止公開可保存在文件系統(tǒng)中其他位置的敏感信息。數(shù)據(jù)存儲在獨立于當(dāng)前用戶和代碼所在的程序集的數(shù)據(jù)艙中。
▲System.Management
提供對一組豐富的管理信息和管理事件(它們是關(guān)于符合 Windows Management Instrumentation (WMI) 基礎(chǔ)結(jié)構(gòu)的系統(tǒng)、設(shè)備和應(yīng)用程序的)的訪問。
▲System.Management.Instrumentation
提供在規(guī)范應(yīng)用程序管理并通過 WMI 向潛在使用者公開管理信息和事件時必需的類。這樣,Microsoft Application Center 或 Microsoft Operations Manager 等使用者就可以輕松地管理您的應(yīng)用程序,而管理員腳本或其他應(yīng)用程序(托管應(yīng)用程序和非托管應(yīng)用程序)也可以監(jiān)視和配置您的應(yīng)用程序。
▲System.Messaging
提供使您可以連接、監(jiān)視和管理網(wǎng)絡(luò)上的消息隊列以及發(fā)送、接收或查看消息的類。
▲System.Net
為當(dāng)前網(wǎng)絡(luò)采用的多種協(xié)議提供簡單的編程接口。WebRequest 和 WebResponse 類構(gòu)成了所謂的可插接式協(xié)議的基礎(chǔ),該協(xié)議是一種網(wǎng)絡(luò)服務(wù)的實現(xiàn),它使您可以開發(fā)使用 Internet 資源的應(yīng)用程序,而不必考慮各個協(xié)議的具體細(xì)節(jié)。
▲System.Net.Sockets
為需要嚴(yán)格控制網(wǎng)絡(luò)訪問的開發(fā)人員提供 Windows 套接字 (Winsock) 接口的托管實現(xiàn)。
▲System.Reflection
包含提供已加載類型、方法和字段的托管視圖的類和接口,并具有動態(tài)創(chuàng)建和調(diào)用類型的能力。
▲System.Reflection.Emit
包含允許編譯器或工具發(fā)出元數(shù)據(jù)和 Microsoft 中間語言 (MSIL) 并在磁盤上生成 PE 文件(可選)的類。這些類的主要客戶端是腳本引擎和編譯器。
▲System.Resources
提供允許開發(fā)人員創(chuàng)建、存儲和管理應(yīng)用程序中使用的各種區(qū)域性特定資源的類和接口。
▲System.Runtime.CompilerServices
為使用托管代碼的編譯器編寫器提供功能,以在影響公共語言運(yùn)行庫的運(yùn)行時行為的元數(shù)據(jù)中指定屬性。此命名空間中的類只用于編譯器編寫器。
▲System.Runtime.InteropServices
提供各種支持 COM Interop 和平臺調(diào)用服務(wù)的成員。如果對這些服務(wù)不熟悉,請參見與非托管代碼交互操作。
▲System.Runtime.InteropServices.CustomMarshalers
支持 .NET 基礎(chǔ)結(jié)構(gòu),不在代碼中直接使用。
▲System.Runtime.InteropServices.Expando
包含 IExpando 接口,此接口允許通過添加或移除對象的成員來修改對象。
▲System.Runtime.Remoting
提供允許開發(fā)人員創(chuàng)建和配置分布式應(yīng)用程序的類和接口。
▲System.Runtime.Remoting.Activation
提供支持服務(wù)器和客戶端遠(yuǎn)程對象激活的類和對象。
▲System.Runtime.Remoting.Channels
包含支持和處理信道和信道接收器的類,這些信道和信道接收器在客戶端對遠(yuǎn)程對象調(diào)用方法時用作傳輸媒介。
▲System.Runtime.Remoting.Channels.Http
包含使用 HTTP 協(xié)議與遠(yuǎn)程位置之間相互傳輸消息和對象的信道。默認(rèn)情況下,HTTP 信道以 SOAP 格式對對象和方法調(diào)用進(jìn)行編碼以便傳輸,但在信道的配置屬性中也可以指定其他編碼和解碼格式化程序接收器。
▲System.Runtime.Remoting.Channels.Tcp
包含使用 TCP 協(xié)議與遠(yuǎn)程位置之間相互傳輸消息和對象的信道。默認(rèn)情況下,TCP 信道以二進(jìn)制格式對對象和方法調(diào)用進(jìn)行編碼以便傳輸,但在信道的配置屬性中也可以指定其他編碼和解碼格式化程序接收器。
▲System.Runtime.Remoting.Contexts
包含定義所有對象所駐留的上下文的對象。上下文是一個有序的屬性序列,用于定義其中的對象所處的環(huán)境。上下文是在對象的激活過程中創(chuàng)建的,這些對象被配置為要求某些自動服務(wù),如同步、事務(wù)、實時 (JIT) 激活、安全性等。多個對象可以存留在一個上下文內(nèi)。
▲System.Runtime.Remoting.Lifetime
包含管理遠(yuǎn)程對象生存期的類。傳統(tǒng)上,分布式垃圾回收功能使用引用計數(shù)和 Ping 來控制對象的生存期。這種機(jī)制在每一項服務(wù)只有較少的客戶端時可以正常工作,但是當(dāng)每一項服務(wù)有幾千個客戶端時就不能正常工作了。遠(yuǎn)程處理生存期服務(wù)將每一項服務(wù)與一個租約關(guān)聯(lián),當(dāng)租約到期時,就會刪除該服務(wù)。生存期服務(wù)可以起到傳統(tǒng)的分布式垃圾回收器的作用,并且當(dāng)每一項服務(wù)的客戶端數(shù)量增加時也能很好地調(diào)整。
▲System.Runtime.Remoting.Messaging
包含用于創(chuàng)建和遠(yuǎn)程處理消息的類。遠(yuǎn)程處理基礎(chǔ)結(jié)構(gòu)使用消息與遠(yuǎn)程對象進(jìn)行通信。消息用于傳輸遠(yuǎn)程方法調(diào)用、激活遠(yuǎn)程對象和交流信息。消息對象攜帶一組命名屬性,其中包括操作標(biāo)識符、代表信息和參數(shù)。
▲System.Runtime.Remoting.Metadata
包含可用于為對象和字段自定義 SOAP 的生成和處理的類和屬性。此命名空間中的類可用于指示 SOAPAction、類型輸出、XML 元素名和 XML 命名空間 URI 方法。
▲System.Runtime.Remoting.Metadata.W3cXsd2001
包含由萬維網(wǎng)聯(lián)合會 (W3C) 在 2001 年定義的 XML 架構(gòu)定義 (XSD)。W3C 中的“XML Schema Part2: Data types”(XML 架構(gòu)第二部分:數(shù)據(jù)類型)規(guī)范確定了各種數(shù)據(jù)類型的格式和行為。此命名空間包含符合 W3C 規(guī)范的數(shù)據(jù)類型的包裝類。所有日期和時間類型都符合 ISO 標(biāo)準(zhǔn)規(guī)范。
▲System.Runtime.Remoting.MetadataServices
包含由 Soapsuds.exe 命令行工具和用戶代碼用來在元數(shù)據(jù)和遠(yuǎn)程處理基礎(chǔ)結(jié)構(gòu)的 XML 架構(gòu)之間相互轉(zhuǎn)換的類。
▲System.Runtime.Remoting.Proxies
包含控制和提供代理功能的類。代理是作為遠(yuǎn)程對象映像的本地對象。代理使客戶端可以跨遠(yuǎn)程處理邊界訪問對象。
▲System.Runtime.Remoting.Services
包含為 .NET Framework 提供功能的服務(wù)類。
▲System.Runtime.Serialization
包含可用于序列化和反序列化對象的類。序列化是將對象或?qū)ο髨D轉(zhuǎn)換為線性的字節(jié)序列以存儲或傳輸?shù)狡渌恢玫倪^程。反序列化是接受存儲的信息并用這些信息重新創(chuàng)建對象的過程。
▲System.Runtime.Serialization.Formatters
提供由序列化格式化程序使用的通用枚舉、接口和類。
▲System.Runtime.Serialization.Formatters.Binary
包含可用于以二進(jìn)制格式序列化和反序列化對象的 BinaryFormatter 類。
▲System.Runtime.Serialization.Formatters.Soap
包含可用于以 SOAP 格式序列化和反序列化對象的 SoapFormatter 類。
▲System.Security
提供 .NET Framework 安全系統(tǒng)的基礎(chǔ)結(jié)構(gòu),包括權(quán)限的基類。
▲System.Security.Cryptography
提供加密服務(wù),包括數(shù)據(jù)的安全編碼和解碼,以及其他許多操作,如哈希處理、隨機(jī)數(shù)生成和消息身份驗證。
▲System.Security.Cryptography.X509Certificates
包含 Authenticode X.509 v.3 證書的公共語言運(yùn)行庫實現(xiàn)。此證書用唯一明確標(biāo)識證書持有者的私鑰簽名。
▲System.Security.Cryptography.XML
包含支持創(chuàng)建和驗證 XML 數(shù)字簽名的類。此命名空間中的類貫徹了萬維網(wǎng)聯(lián)合會 (W3C) 建議“XML-Signature Syntax and Processing”(XML 簽名語法和處理),詳見 " 。
▲System.Security.Permissions
定義根據(jù)策略控制操作和資源訪問的類。
▲System.Security.Policy
包含代碼組、成員條件和證據(jù)。這三種類型的類用于創(chuàng)建由 .NET Framework 安全策略系統(tǒng)應(yīng)用的規(guī)則。證據(jù)類是安全策略的輸入,成員條件是開關(guān);二者共同創(chuàng)建策略語句并確定授予的權(quán)限集。策略級別和代碼組是策略層次的結(jié)構(gòu)。代碼組是規(guī)則的封裝并且在策略級別中分層排列。
▲System.Security.Principal
定義表示運(yùn)行代碼的安全上下文的主體對象。
▲System.ServiceProcess
提供使您可以實現(xiàn)、安裝和控制 Windows 服務(wù)應(yīng)用程序的類。服務(wù)是不需要用戶界面長期運(yùn)行的可執(zhí)行文件。實現(xiàn)服務(wù)的過程包括:從 ServiceBase 類繼承,定義在傳入啟動、停止、暫停和繼續(xù)命令時處理的特定行為,以及定義當(dāng)系統(tǒng)關(guān)閉時所采取的自定義行為和操作。
▲System.Text
包含表示 ASCII、Unicode、UTF-7 和 UTF-8 字符編碼的類;用于在字符塊和字節(jié)塊之間相互轉(zhuǎn)換的抽象基類;以及不需要創(chuàng)建字符串的中間實例就可以操作和格式化字符串對象的幫助器類。
▲System.Text.RegularExpressions
包含提供對 .NET Framework 正則表達(dá)式引擎的訪問的類。此命名空間提供的正則表達(dá)式功能可在 Microsoft .NET Framework 中運(yùn)行的任何平臺或語言上使用。
▲System.Threading
提供支持多線程編程的類和接口。除了用于同步線程活動和數(shù)據(jù)訪問的類(Mutex、Monitor、Interlocked、AutoResetEvent 等)外,此命名空間還包括一個 ThreadPool 類(使您可以使用系統(tǒng)提供的線程池)和一個 Timer 類(對線程池中的線程執(zhí)行回調(diào)方法)。
▲System.Timers
提供允許以指定的間隔引發(fā)事件的 Timer 組件。
▲System.web
提供支持瀏覽器/服務(wù)器通信的類和接口。此命名空間包括 HTTPRequest 類(它提供有關(guān)當(dāng)前 HTTP 請求的大量信息),HTTPResponse 類(它管理 HTTP 到客戶端的輸出)和 HTTPServerUtility 對象(它提供對服務(wù)器端實用工具和進(jìn)程的訪問)?!鳶ystem.Web 還包括用于 Cookie 操作、文件傳輸、異常信息和輸出緩存控制的類。
▲System.Web.Caching
提供用于在服務(wù)器上緩存常用數(shù)據(jù)的類。其中包括 Cache 類,該類是一個字典,您可以在其中存儲任意數(shù)據(jù)對象,如哈希表和數(shù)據(jù)集。它還為這些對象提供了失效功能,并為您提供了添加和移除這些對象的方法。您也可以添加依賴于其他文件或緩存項的對象,并在某個對象從 Cache 中被移除時執(zhí)行回調(diào)以通知您的應(yīng)用程序。
▲System.Web.Configuration
包含用于設(shè)置 ASP.NET 配置的類。
▲System.Web.Hosting
提供從 Microsoft Internet 信息服務(wù) (IIS) 的外部托管應(yīng)用程序承載 ASP.NET 應(yīng)用程序的功能。
▲System.Web.Mail
包含使您能夠使用 CDOSYS 消息組件構(gòu)造和發(fā)送消息的類。郵件消息通過 Microsoft Windows 2000 中內(nèi)置的 SMTP 郵件服務(wù)或任意的 SMTP 服務(wù)器發(fā)送。此命名空間中的類可從 ASP.NET 或任何托管應(yīng)用程序中使用。
▲System.Web.Mobile
包含生成 ASP.NET 移動 Web 應(yīng)用程序所需的核心功能,其中包括身份驗證和錯誤處理。
▲System.Web.Security
包含用于在 Web 服務(wù)器應(yīng)用程序中實現(xiàn) ASP.NET 安全的類。
▲System.Web.Services
包含使您可以利用 ASP.NET 和 XML Web services 客戶端來創(chuàng)建 XML Web services 的類。XML Web services 是一些應(yīng)用程序,它們提供了在使用標(biāo)準(zhǔn)協(xié)議(如 HTTP、XML、XSD、SOAP 和 WSDL)的松耦合環(huán)境下進(jìn)行消息交換的能力。利用 XML Web services,可以在異質(zhì)環(huán)境下的公司內(nèi)部和公司之間生成模塊化應(yīng)用程序,使它們與各種各樣的實現(xiàn)、平臺和設(shè)備交互操作。這些應(yīng)用程序基于 SOAP 的 XML 消息的各部分可以是嚴(yán)格定義的(結(jié)構(gòu)化和類型化)或松散定義的(使用任意 XML)。這些消息能夠隨時間而發(fā)展,并且不會破壞協(xié)議,這種能力對于作為未來 Web 構(gòu)造塊的 XML Web services 的靈活性和可靠性來說是最根本的。
▲System.Web.Services.Configuration
由一些類組成,這些類配置用 ASP.NET 創(chuàng)建的 XML Web services 的運(yùn)行方式。
▲System.Web.Services.Description
由一些類組成,這些類使您能夠使用 Web 服務(wù)描述語言 (WSDL) 公開描述 XML Web services。此命名空間中的每個類對應(yīng)于 WSDL 規(guī)范中的一個特定元素,并且類層次結(jié)構(gòu)對應(yīng)于有效的 WSDL 文檔的 XML 結(jié)構(gòu)。
▲System.Web.Services.Discovery
由一些類組成,這些類允許 XML Web services 客戶端通過稱為“XML Web services 發(fā)現(xiàn)”的進(jìn)程來定位 Web 服務(wù)器上可用的 XML Web services。
▲System.Web.Services.Protocols
由一些類組成,這些類定義用于在通信期間通過網(wǎng)絡(luò)在 XML Web services 客戶端和用 ASP.NET 創(chuàng)建的 XML Web services 之間傳輸數(shù)據(jù)的協(xié)議。
▲System.Web.SessionState
提供支持在服務(wù)器上存儲特定于 Web 應(yīng)用程序中的單個客戶端的數(shù)據(jù)的類和接口。會話狀態(tài)數(shù)據(jù)用于向客戶端提供與應(yīng)用程序的持久連接的外觀。狀態(tài)信息可以存儲在本地進(jìn)程內(nèi)存中,或者,對于網(wǎng)絡(luò)場配置來說,可以使用 ASP.NET 狀態(tài)服務(wù)或 SQL Server 數(shù)據(jù)庫將狀態(tài)信息存儲在進(jìn)程外。
▲System.Web.UI
提供使您可以創(chuàng)建以 Web 頁上的用戶界面形式出現(xiàn)在 Web 應(yīng)用程序中的控件和頁的類和接口。此命名空間包括 Control 類,該類為所有控件(不論是 HTML 控件、Web 控件還是用戶控件)提供一組通用功能。它還包括 Page 控件,每當(dāng)對 Web 應(yīng)用程序中的頁發(fā)出請求時,都會自動生成此控件。另外還提供了一些類,這些類提供 Web 窗體服務(wù)器控件數(shù)據(jù)綁定功能、保存給定控件或頁的視圖狀態(tài)的能力,以及對可編程控件和文本控件都適用的分析功能。
▲System.Web.UI.Design
包含可用于擴(kuò)展 Web 窗體設(shè)計時支持的類。
▲System.Web.UI.Design.WebControls
包含可用于擴(kuò)展 Web 服務(wù)器控件設(shè)計時支持的類。
▲System.Web.UI.HtmlControls
包含使您可以在 Web 窗體頁上創(chuàng)建 HTML 服務(wù)器控件的類集合。HTML 服務(wù)器控件運(yùn)行在服務(wù)器上,并且直接映射到大多數(shù)瀏覽器所支持的標(biāo)準(zhǔn) HTML 標(biāo)記。這使您能夠以編程方式控制 Web 窗體頁上的 HTML 元素。
▲System.Web.UI.MobileControls
包含一組 ASP.NET 服務(wù)器控件,這些控件可以針對不同的移動設(shè)備智能地呈現(xiàn)您的應(yīng)用程序。
▲System.Web.UI.MobileControls.Adapters
包含由 ASP.NET 移動控件用來自定義設(shè)備和支持?jǐn)U展設(shè)備的核心設(shè)備適配器類。
▲System.Web.UI.WebControls
包含使您可以在 Web 頁上創(chuàng)建 Web 服務(wù)器控件的類。Web 服務(wù)器控件運(yùn)行在服務(wù)器上,并且包括按鈕和文本框等窗體控件。它們還包括類似于日歷的特殊控件。由于 Web 服務(wù)器控件運(yùn)行在服務(wù)器上,因此可以以編程方式來控制這些元素。Web 服務(wù)器控件比 HTML 服務(wù)器控件更抽象。它們的對象模型不一定反映 HTML 語法。
▲System.Windows.Forms
包含用于創(chuàng)建基于 Windows 的應(yīng)用程序的類,這些應(yīng)用程序可以充分利用 Microsoft Windows 操作系統(tǒng)中的豐富用戶界面功能。
▲System.Windows.Forms.Design
包含支持 Windows 窗體組件的設(shè)計時配置和行為的類。這些類包括:提供 Windows 窗體組件(即一組設(shè)計時服務(wù))支持的設(shè)計器類、用于配置特定屬性類型的 UITypeEditor 類,以及用于導(dǎo)入 ActiveX 控件的類。
▲System.Xml
提供基于標(biāo)準(zhǔn)的 XML 處理支持。
▲System.Xml.Schema
包含提供基于標(biāo)準(zhǔn)的 XML 架構(gòu)定義語言 (XSD) 架構(gòu)支持的 XML 類。
▲System.Xml.Serialization
包含用于將對象序列化為 XML 格式的文檔或流的類。
▲System.Xml.XPath
包含 XPath 分析器和計算引擎。它支持 W3C XML 路徑語言 (XPath) 1.0 版建議 (" )。
▲System.Xml.Xsl
提供可擴(kuò)展樣式表轉(zhuǎn)換 (XSLT) 轉(zhuǎn)換支持。它支持 W3C XSL 轉(zhuǎn)換 (XSLT) 1.0 版建議 (" )。
用法
參考資料:MSDN
通常使用的connect,實際上最后一個參數(shù)使用的是Qt::AutoConnection類型:
Qt支持6種連接方式,其中3中最主要:
Qt::DirectConnection(直連方式)
當(dāng)信號發(fā)出后,相應(yīng)的槽函數(shù)將立即被調(diào)用。emit語句后的代碼將在所有槽函數(shù)執(zhí)行完畢后被執(zhí)行。(信號與槽函數(shù)關(guān)系類似于函數(shù)調(diào)用,同步執(zhí)行)
Qt::QueuedConnection(排隊方式)
當(dāng)信號發(fā)出后,排隊到信號隊列中,需等到接收對象所屬線程的事件循環(huán)取得控制權(quán)時才取得該信號,調(diào)用相應(yīng)的槽函數(shù)。emit語句后的代碼將在發(fā)出信號后立即被執(zhí)行,無需等待槽函數(shù)執(zhí)行完畢。(此時信號被塞到信號隊列里了,信號與槽函數(shù)關(guān)系類似于消息通信,異步執(zhí)行)
Qt::AutoConnection(自動方式)
Qt的默認(rèn)連接方式,如果信號的發(fā)出和接收這個信號的對象同屬一個線程,那個工作方式與直連方式相同;否則工作方式與排隊方式相同。
參見文章: