国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

在ASP.NET中使用非托管COM組件

2024-07-10 13:07:32
字體:
來源:轉載
供稿:網友

    眾所周知,asp.net是基于通用語言運行庫創建的,也就是所謂的托管執行環境。生成的代碼稱為托管代碼。編譯器能夠從源代碼的描述中產生元數據信息,而運行庫又從元數據中獲得托管代碼的信息。而我們編寫的組件一般是在非托管環境下創建的,這些組件往往不包含元數據信息,那么我們怎么在托管代碼中使用這些元數據信息呢? 
   
   為了在托管環境中使用非托管代碼,我們首先必須手工為這些現有的組件產生元數據信息 。必須有一種工具能夠產生元數據。能夠從某個地方獲得元數據。這個元數據的發源地就是類型庫,事實上,今天所有的組件都有一個類型庫。 
   
   這里為了說明如何產生元數據信息,我們不妨以microsoft agent組件為例進行說明。這個組件類似于office的小助手,它能夠完成各種豐富多彩的人性化的動作,并且支持語音識別和語音合成。一般的操作系統都默認安裝了這個組件,用戶該不會發愁沒有這個組件吧。如果你的系統刪除了這個組件,你可以到http://microsoft.com/msagent/downloads.htm.去下載。 
   
   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文件是完全一樣的文件。 
   
   aximp %systemroot%/msagent/agentctl.dll 
   
  <p align=center><htmchina:image id=image1|1></htmchina></p>
    
    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查看器獲得結果。
  [htmchina:imagealign align=center][htmchina:image id=image1|2][/htmchina:image][/htmchina:imagealign][htmchina:imagealign align=center][htmchina:image id=image1|3][/htmchina:image][/htmchina:imagealign]
    注意生成的匯編文件不一樣,名稱空間的名稱也不一樣,在asp.net頁面往往需要使用 @import 導入名稱空間,不過它們的類、屬性、方法都是一樣的。對于asp.net程序員來說,整個藍色的符號都是很重要的,因為它們表示的是一個類或者是一個接口。如果我們對這些類或者接口進行展開,我們會獲得一系列屬性和方法的列表。 
   
    我們看到的所有方法都有一個精確的數據類型描述。首先是方法名稱,冒號后面是返回值類型圓括號中是方法需要的參數。 
   
   當我們談及用get_ 和set_方法描述屬性的時候,vbscript程序員可能會一頭霧水,我們知道每一個屬性實際上是對應于類中的一個私有成員,屬性的讀寫分別是通過這兩個函數實現的。
  [htmchina:imagealign align=center][htmchina:image id=image1|4][/htmchina:image][/htmchina:imagealign] 
   
    每一個屬性旁邊都有一個紅色的標記,雙擊這個屬性,我們可以獲得屬性的定義,我們可以看到屬性可以為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組件中,通過組件調用間接實現。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 庐江县| 饶阳县| 崇左市| 区。| 曲松县| 丰宁| 伊金霍洛旗| 田东县| 缙云县| 乐清市| 庐江县| 和平区| 友谊县| 朝阳区| 都昌县| 安丘市| 昆山市| 镇原县| 柳州市| 奉化市| 大竹县| 宁晋县| 瑞金市| 天全县| 天水市| 长春市| 大埔县| 乌恰县| 卢湾区| 余姚市| 章丘市| 淮阳县| 石狮市| 昆山市| 新源县| 通山县| 板桥市| 达拉特旗| 浪卡子县| 奈曼旗| 城步|