解讀非托管COM組件的使用_.Net教程
推薦:解說ASP.NET中的session存儲模式運用在asp.net中的Session存儲方式不象asp那樣單一,一共提供了三種存儲方式,由于最近一個2000多人使用的web軟件出現了故障,用戶每天早上在某一時刻出現難以登陸現象,接著Session丟值出現,只有重啟IIS,或機器.這時程序恢復正常了.整天都不會出現同樣的問題
asp.net是基于通用語言運行庫創建的,也就是所謂的托管執行環境。生成的代碼稱為托管代碼。編譯器能夠從源代碼的描述中產生元數據信息,而運行庫又從元數據中獲得托管代碼的信息。而我們編寫的組件一般是在非托管環境下創建的,這些組件往往不包含元數據信息,那么我們怎么在托管代碼中使用這些元數據信息呢?
為了在托管環境中使用非托管代碼,我們首先必須手工為這些現有的組件產生元數據信息。必須有一種工具能夠產生元數據。能夠從某個地方獲得元數據。這個元數據的發源地就是類型庫,事實上,今天所有的組件都有一個類型庫。
這里為了說明如何產生元數據信息,我們不妨以Microsoft Agent組件為例進行說明。這個組件類似于Office的小助手,它能夠完成各種豐富多彩的人性化的動作,并且支持語音識別和語音合成。一般的操作系統 都默認安裝了這個組件,用戶該不會發愁沒有這個組件吧。如果你的系統刪除了這個組件,你可以到http://microsoft.com/msagent/downloads.htm去下載。下面開始介紹如何在asp.net中使用非托管COM組件。
1、首先是創建元數據
Microsoft Agent控件默認是安裝在%systemroot%\msagent\目錄下,首先運行開始菜單中Visual Studio.NET Command Prompt(命令提示)菜單項。在這個目錄執行下面的命令。
tlbimp agentctl.dll /out: agentctl_proxy.dll
通過這個命令我們可以創建一個包含元數據信息的代理文件agentctl_proxy.dll。注意這并不是一個真正的動態連接庫文件,而是一個裝配文件(Assembly),也就是我們非托管COM組件的代理。也可以通過.NET框架提供的實用程序aximp.exe創建,命令行如下,這樣它會生成兩個文件,如下圖所示:注意AgentObjects.dll 和agentctl_proxy.dll文件是完全一樣的文件。
C:\Program Files\Microsoft Visual Studio 9.0\VC>aximp %systemroot%\msagent\agentctl.dll
2、安裝到asp.net中
把元數據文件安裝到asp.net 環境中有兩種辦法:
一是把文件復制到應用程序的BIN目錄。
二是把它復制到asp.net目錄。
第二種方法有一個缺陷,你必須在每一個使用組件的asp.net頁面插入一個@Assembly語句。而保存到Bin目錄則可以避免這一點。assembly將會被加載到應用程序的所有asp.net頁面。因此我們最好還是把它放在bin目錄。
3、IL反匯編(Disassembler)
現在基本上到了令大多數VB或VBScript程序員頭疼的時候了,我們要利用一個反匯編器產生一些重要信息。
Assembly 的名稱空間(使用 @Import 語句)
精確的類名(這可能與ASP有著很大的不同!)
方法和屬性的數據類型
方法和屬性的精確拼寫。注意在 C# 中 Bodytext 和 BodyText是兩個完全不同的變量。
產生上述信息需要使用IL (Intermediate Language) Disassembler中間語言反匯編器,你可以在生成元數據后,鍵入ildasm.exe啟動該工具。然后可以利用 File | Open,選擇相應的文件,顯示的結果非常類似于OLE/COM查看器獲得結果。
注意生成的匯編文件不一樣,名稱空間的名稱也不一樣,在asp.net頁面往往需要使用 @Import 導入名稱空間,不過它們的類、屬性、方法都是一樣的。對于asp.net程序員來說,整個藍色的符號都是很重要的,因為它們表示的是一個類或者是一個接口。如果我們對這些類或者接口進行展開,我們會獲得一系列屬性和方法的列表。
我們看到的所有方法都有一個精確的數據類型描述。首先是方法名稱,冒號后面是返回值類型圓括號中是方法需要的參數。當我們談及用get_ 和set_方法描述屬性的時候,VBScript程序員可能會一頭霧水,我們知道每一個屬性實際上是對應于類中的一個私有成員,屬性的讀寫分別是通過這兩個函數實現的。每一個屬性旁邊都有一個紅色的標記,雙擊這個屬性,我們可以獲得屬性的定義,我們可以看到屬性可以為Get, Set 或者 Get/Set。
4、組件的使用
當我們對元數據了解清楚以后,剩下的工作就是如何在asp.net 中使用這個組件,下面是一段使用MsAgent的代碼:
<% @Page Language="C#" %>
<% @Import Namespace="AgentObjects" %>
<% AxAgentObjects.AxAgent AxAgent=new AxAgentObjects.AxAgent();
IAgentCtlCharacterEx Character;
AxAgent.Characters.Load("Genie",(object)"GENIE.ACS");
Character = AxAgent.Characters["Genie"];
Character.LanguageID = 0x409;
// Display the character. Character.Show(null);
Character.Speak(“Hello World”, null);
Response.Write(Character.Name);
Character.Play("Wave");
Character.Play("Hide");
%>
當導入類型庫以后,接著我們要創建這個類的實例,剩下的使用方法基本上和ASP應用組件差不多。
所有的COM組件調用的方法基本上相同,正如在托管應用程序(C#、Visual Basic.NET)加入一個COM組件引用,接著系統要為這些非托管代碼生成一個封裝,實際上也是執行上面的步驟,即導入類型庫。實際上這種方法可以用 于所有的托管應用程序中,包括托管的C++代碼、C#、Visual Basic.NET環境,.NET 框架的這種互操作性保護了組件開發者的既有投資,而且為我們的托管程序設計提供了一條思路。即我們可以把許多使用托管代碼難以實現或者實現起來非常麻煩的 功能(比如通過API函數調用讀寫軟盤硬盤物理扇區)封裝到一個非托管COM組件中,通過組件調用間接實現。
分享:解讀.Net的精髓——XML和SOAPInternet 的應用正在不斷地擴大,但我們的 Internet 編程方式還處于石器時代。Internet 用戶就像老式主機的分時終端上的用戶一樣,他們從一個受保護的資源請求信息,然后等待回應。你從正在瀏覽的 Internet 站點上接收的信息由它希望提供給你的、基于HTML 的
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發送Email實例(可帶附件)
- js實現廣告漂浮效果的小例子
- asp.net Repeater 數據綁定的具體實現
- Asp.Net 無刷新文件上傳并顯示進度條的實現方法及思路
- Asp.net獲取客戶端IP常見代碼存在的偽造IP問題探討
- VS2010 水晶報表的使用方法
- ASP.NET中操作SQL數據庫(連接字符串的配置及獲取)
- asp.net頁面傳值測試實例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲過程實現分頁示例代碼
- 相關鏈接:
- 教程說明:
.Net教程-解讀非托管COM組件的使用
。