NET組件和COM組件之間的相互操作

來源:互聯網
上載者:User

        .NET技術是微軟大力推廣的下一代平台技術,自從.NET技術架構Beta2版本的正式發布,此項技術也逐漸走向成熟和穩定。按照微軟的平台系統佔有率,我們不難想象得到,在未來的一兩年內.NET技術必定會勢如破竹一般的登上主流的技術平台,而一個新的技術平台得以快速發展的最重要的前提是:他不會徹底的摒棄以前的技術,這一點對於.NET技術來說指的就是COM/COM+技術了。

         一般來說,在IT技術界以及硬體產業,技術的更新換代速度非常得驚人,而慣例是所有的新技術都會遵循向下相容的原則,但是.NET技術不僅僅做到了這一點,.NET甚至實現了相互之間的各自調用,這一點是非常難能可貴的。也就是說,不但我們可以在.NET組件中調用COM組件,同時也可以在COM組件中正常的調用.NET組件。這點帶來的好處是顯而易見的,一方面我們可以保持現有的技術資源,另一方面,在現有資源中可以利用.NET所帶來的各種新技術。

在開始之前我們先來看一下.NET組件和我們目前常使用的COM組件之間有何不同之處吧。

一、.NET組件可以分為兩大類:共用的.NET組件和私人的.NET組件。

1. 共用的.NET組件需要通過標準公開關鍵字密碼技術來保證自身的唯一性,在這一點上面比較類似於COM的全球唯一ID號碼GUID。但是,我們在可能的情況下應當盡量避免使用共用的.NET組件,因為這樣將會有可能再一次的陷入目前在視窗系統下長期困擾開發人員的“DLL地獄”。

2. 私人的.NET組件是我們將會經常使用的.NET組件方式,在這種方式之下,我們發布.NET組件需要做的只是簡單的進行拷貝操作就可以了,彷彿回到了遠古的DOS時代了,在也不必關心紛繁複雜的系統註冊表了,也不必擔心DLL的版本被覆蓋等等的問題了。

3. 感悟: COM組件是微軟曾經力推了很多年的一種代碼複用的技術架構,在這些年裡也得到了極大的發展和應用,但它的弊端卻也日益明顯,我們不得不面對眾多的COM組件之間的版本控制和令人恐怖的DLL地獄,還有註冊表、GUID等等。在我們安裝一個軟體的同時,也帶來了大量的我們所未知的版本繁多的COM組件到我們的作業系統中。但是,COM組件的技術優勢也是明顯的,在很大的程度上實現了Windows平台下的代碼複用,所以我們才會提出這樣的一個話題,如何才能在.NET技術日臻成熟的情況下,保護和利用已經存在的大量的採用COM技術的軟體和產品呢?

二、下面我們就探討一下,如何?.NET組件和COM組件之間的相會調用和操作。

1. 首先,我們來看看在現有的COM組件中如何調用.NET編寫的組件吧:
在這裡我們使用C#編寫一個最簡單的組件,僅僅實現返回一個字串,詳細的代碼如下: 在上面的.NET組件當中我們實現了一個類成員:say。他的用途是簡單的返回一段字串。

切換到MS-DOS命令列下面,運行:
C:\>csc /t:library /out ClassLibrary1.DLLClassLibrary1.cs 

上面的編譯器參數/t:library 告訴C#編譯器我們現在是在建立一個庫應用程式。這樣,我們就得到了一個名稱為ClassLibrary1.DLL的.NET組件了。但是想要在現有的COM組件中使用這個組件,我們還有進行如下步驟:

切換到MS-DOS命令列下面,運行:
C:\>regasm out ClassLibrary1.DLL /regfile:ClassLibrary1.reg 

上面的命令列是註冊我們的.NET組件,並且產生了一個備用的註冊表檔案。大家一定會記得在以前我們的win9x/NT/2000下面註冊COM組件使用的命令是:regsvr32 c:\test.dll 

在.NET下面,註冊.NET組件就需要上面的regasm命令了,值得注意的是,這個方法僅僅是為了可供COM組件來調用,.NET本身之間相互調用組件是不需要任何註冊的!還沒有結束呢,接下來我們需要:

切換到MS-DOS命令列下面,運行:
C:\>tlbExp ClassLibrary1.dll /out:ClassLibrary1.tlb 

上面的命令列表示將會產生一個.NET組件的類型庫,目的是為了我們在COM組件中進行提前綁定操作。好了,接下來我們就可以在自己的基於目前COM技術的代碼中方便的使用上面我們使用C#編寫的.NET組件了。在這裡,我們使用VB6.0編寫一個小小的測試代碼,在開始之前我們需要在VB的Integration Environment中使用菜單中的“引用”選項,選擇我們剛才產生的類型庫檔案ClassLibrary1.tlb。

VB測試的代碼如下:
Private Sub Form_Load()
Dim test As New ClassLibrary1.hello
Dim str As String

str = test.say("dddd")
MsgBox str
End Sub 

2. 接下來,我們就來看看,如何在.NET組件中使用目前存在的COM組件吧。
對於.NET來講,使用COM組件要想對簡單一些。.NET在設計之初就考慮到了如何方便的利用現有的各種技術資源,這也是微軟的一貫作風,.NET的強大之處也可見一斑。.NET提供了大量的類庫來方便的實現同COM的相互操作,其中很重要的一個名稱空間就是:System.Runtime.InteropServices。通過這個名稱空間的名字我們也可以從字面上看出,“互操作服務”。System.Runtime.InteropServices這個名稱空間提供了一系列的類來對COM對象進行操作。

下面的例子中,我們來調用一下系統內建的Win32函數MessageBoxA,這個函數位於系統的COM組件user32.dll當中,我們調用的代碼如下:
using System;
using System.Runtime.InteropServices;
class Test
{
[DllImport("user32.dll")]
public static extern int MessageBoxA(inthWnd,string strMsg,string strCaption,intnType);
public static void Main()
{
int myMsg;
myMsg=MessageBoxA(0,"Hello!","test",0);
}

切換到MS-DOS命令列下面,運行:
C:\>csc Test.cs 

編譯完畢我們的C#應用程式之後,直接運行就可以看到對話方塊了!
需要注意的是,在調用COM組件之前,我們需要在.NET程式中引用名稱空間:System.Runtime.InteropServices。因為我們需要使用這個名稱空間所提供的一個方法:DllImport。 怎麼樣,在.NET中使用COM組件是非常的方便的吧。上面是我們調用的系統本身內建的DLL組件,同樣的,也可以使用這種方法來調用我們自己使用VB/VC編寫的COM組件。

三、總結:好了,我們已經探討完了如何在.NET和COM之間相互操作了,我們也很顯然的看到了.NET技術的強大,現在越早掌握.NET技術就會在未來越容易的佔領領先的位置,讓我們共同努力掌握強大的.NET平台技術吧。

聯繫我們

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

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

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.