讓COM利用.NET裝配

來源:互聯網
上載者:User
除了提供與舊版相容之外,.NET架構還同樣支援前向相容性,其含義就是暴露.NET裝配供COM利用是可能的。現在就讓我們看看如何讓COM利用.NET裝配。
從COM調用.NET裝配

現在讓我們看看從COM利用.NET裝配的原理,如圖A所示。
圖A


從COM利用.NET裝配
       

和.NET調用COM對象的過程類似,這裡我們對.NET裝配採用了一個封裝類,你可以通過COM應用程式對其進行訪問。這種封裝類就是所謂的COM可調用封裝(CCW)。說了半天,我們該如何利用Visual Studio.NET達到以上目標呢?

首先啟動Visual Studio.NET,然後建立Class Library類型的新項目,名稱是DotnetForCOM(舉個例子,你當然也可以起自己的名字)。給新類增加一個預設的構造器和一些公用方法,這些東西都是應該在COM中可用的。一旦做好以上準備即可右擊Solution Explorer中的項目,選中Properties彈出項目屬性頁面。然後在屬性頁面上選擇Configuration屬性和Build選項。這樣你的面前就會出現如圖B所示的畫面。
圖B
使用屬性頁面


選中Register For COM Interop (如圖B所示)檢查框。現在,當你構造項目之後.NET裝配就會自動地註冊COM Interop。這樣你就能通過COM使用該裝配了。比方說,用Visual Basic 6.0編程的時候,假如你啟動一個新的Visual Basic 6項目並選擇Project菜單和References,那麼.NET裝配就可以通過COM引用了(參看圖C)。
圖C

Visual Basic項目引用

到這裡為止,你即可由Visual Basic 6訪問.NET裝配所提供的功能了。
Visual Studio.NET之外

下面我們討論下不使用Visual Studio.NET時的情況。此時要讓.NET裝配暴露給COM具有額外的要求。
提供預設的構造器

首先,.NET裝配必須提供預設的構造器。這是因為COM 客戶不支援.NET參數化的構造器,所以你必須自己保證給類提供了預設的構造器。你也可以隨預設構造器編寫帶參數的構造器,不過預設構造器需要從COM客戶執行個體化.NET裝配。

組建類型庫

現在為.NET裝配組建類型庫,並在系統註冊表中產生有關的條目。為此可以採用以下兩種方式:
·  採用.NET Framework SDK 所提供的Type Library Exporter工具為.NET裝配產生類型庫。然後用Assembly Registration工具註冊該類型庫。
Tlbexp test.dll  /out:test.tlb Regasm test.dll
·直接組建類型庫並採用Regasm為其註冊。
Regasm test.dll /tlb:test.tlb

.NET 裝配必須有一個Strong Name並且駐留在全域裝配緩衝(Global Assembly Cache)裡。為此你需要採用Strong Name工具(Sn.exe)為裝配產生註冊索引值。完成這一操作之後即可利用GAC工具(Gacutil.exe)把裝配添加到全域裝配緩衝。你還可以用以下語句把裝配加到GAC:
gacutil –I SampleAssembly.dll

接下來你就可以通過COM給.NET裝配增加引用並具體應用它了。CCW在由COM調用.NET裝配的時候產生;它起到了受管和不受管領域之間的橋樑作用。

用屬性修改彙集行為

屬性(Attributes)可以用來修改彙集器(marshaler)所應用的彙集(marshaling)行為。這些屬性分為3種類型,包括:
  1. 在設計時你應用的屬性。
  2. 由Interop工具所應用的屬性
  3. 由你或Interop應用的屬性。

GuidAttribute、ProgldAttribute、MarshalAsAttribute和COMVisibleAttribute是最常用的屬性。
GuidAttribute和ProgIdAttribute用來設定類的GUID和ProgId。

MarshalAsAttribute是可選的。因為所有的資料類型都有其預設的彙集行為。就資料類型而言,比如String類型,這類資料類型作為多種類型彙集是完全可能的,這一屬性是非常必要的。.NET架構的String資料類型在不受管代碼下意味著以下的類型:
  • LPStr
  • LPWStr
  • LPTStr
  • BStr

預設的行為是把String彙集為Bstr。這一屬性可以用來給其他任何不受管類型修改以上行為。
COMVisibleAttribute用來控制裝配之內的類型可見度。裝配之內的公用類型預設是可見的。所以為隱藏某些類型起見就要用到屬性了。

為了全面瞭解屬性,請參看MSDN。
Interop的含義

另外還必須記住,從.NET調用COM對象的時候會影響系統的效能,反之也是一樣的,原因就在於彙集。再有,這種效能上的影響與資料類型是無關的。像整數和位元組這樣的單一資料型別不會影響效能。原因是這類資料類型在受管和不受管記憶體中的表示都是一樣的,所以Interop的工作任務也一樣。彙集行為的影響達到了最小。String資料類型則會降低效能,因為其表示在受管和不受管記憶體中有差別。單一資料型別,也就是在受管和不受管代碼中具有同樣表示的資料類型,它們被稱做blittable資料類型,而其他具有不統一表示的資料類型則被稱做nonblittable資料類型。Interop Marshaler為所有的內建資料類型提供了支援。而對複雜的資料類型,你則需要手工編輯MSIL代碼了。
採用經過測試的代碼

.NET架構為現有的COM和新出現的.NET裝配之間的互操作提供了相應的實現功能。這些功能是通過封裝類的方式實現的,封裝類就如同受管和不受管代碼之間的橋樑。而開發人員則決定是否需要採用Interop以及在什麼場合需要編寫新的代碼。我們的原則是,盡量採用經過測試的代碼而不要編寫需要測試的新代碼。

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。