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

字號(hào):

.NET技術(shù)是微軟大力推廣的下一代平臺(tái)技術(shù),自從.NET技術(shù)架構(gòu)Beta2版本的正式發(fā)布,此項(xiàng)技術(shù)也逐漸走向成熟和穩(wěn)定。按照微軟的平臺(tái)系統(tǒng)占有 率,我們不難想象得到,在未來的一兩年內(nèi).NET技術(shù)必定會(huì)勢(shì)如破竹一般的登上主流的技術(shù)平臺(tái),而一個(gè)新的技術(shù)平臺(tái)得以快速發(fā)展的最重要的前提是:他不會(huì) 徹底的摒棄以前的技術(shù),這一點(diǎn)對(duì)于.NET技術(shù)來說指的就是COM/COM+技術(shù)了。
    一般來說,在IT技術(shù)界以及硬件產(chǎn)業(yè),技術(shù)的更新?lián)Q代速度非常得驚人,而慣例是所有的新技術(shù)都會(huì)遵循向下兼容的原則,但是.NET技術(shù)不僅僅做到了這一 點(diǎn),.NET甚至實(shí)現(xiàn)了相互之間的各自調(diào)用,這一點(diǎn)是非常難能可貴的。也就是說,不但我們可以在.NET組件中調(diào)用COM組件,同時(shí)也可以在COM組件中 正常的調(diào)用.NET組件。這點(diǎn)帶來的好處是顯而易見的,一方面我們可以保持現(xiàn)有的技術(shù)資源,另一方面,在現(xiàn)有資源中可以利用.NET所帶來的各種新技術(shù)。
    在開始之前我們先來看一下.NET組件和我們目前常使用的COM組件之間有何不同之處吧。
    .NET組件可以分為兩大類:共享的.NET組件和私有的.NET組件。
    共享的.NET組件需要通過標(biāo)準(zhǔn)公開關(guān)鍵字密碼技術(shù)來保證自身的性,在這一點(diǎn)上面比較類似于COM的全球ID號(hào)碼GUID。但是,我們?cè)诳赡艿那?況下應(yīng)當(dāng)盡量避免使用共享的.NET組件,因?yàn)檫@樣將會(huì)有可能再一次的陷入目前在視窗系統(tǒng)下長(zhǎng)期困擾開發(fā)人員的“DLL地獄”。
    私有的.NET組件是我們將會(huì)經(jīng)常使用的.NET組件方式,在這種方式之下,我們發(fā)布.NET組件需要做的只是簡(jiǎn)單的進(jìn)行拷貝操作就可以了,仿佛回到了遠(yuǎn)古的DOS時(shí)代了,在也不必關(guān)心紛繁復(fù)雜的系統(tǒng)注冊(cè)表了,也不必?fù)?dān)心DLL的版本被覆蓋等等的問題了。
    而COM組件是微軟曾經(jīng)力推了很多年的一種代碼復(fù)用的技術(shù)框架,在這些年里也得到了極大的發(fā)展和應(yīng)用,但它的弊端卻也日益明顯,我們不得不面對(duì)眾多的 COM組件之間的版本控制和令人恐怖的DLL地獄,還有注冊(cè)表、GUID等等。在我們安裝一個(gè)軟件的同時(shí),也帶來了大量的我們所未知的版本繁多的COM組 件到我們的操作系統(tǒng)中。
    但是,COM組件的技術(shù)優(yōu)勢(shì)也是明顯的,在很大的程度上實(shí)現(xiàn)了Windows平臺(tái)下的代碼復(fù)用,所以我們才會(huì)提出這樣的一個(gè)話題,如何才能在.NET技術(shù)日臻成熟的情況下,保護(hù)和利用已經(jīng)存在的大量的采用COM技術(shù)的軟件和產(chǎn)品呢?
    下面我們就探討一下,如何實(shí)現(xiàn).NET組件和COM組件之間的相會(huì)調(diào)用和操作。
    首先,我們來看看在現(xiàn)有的COM組件中如何調(diào)用.NET編寫的組件吧:
    在這里我們使用C#編寫一個(gè)最簡(jiǎn)單的組件,僅僅實(shí)現(xiàn)返回一個(gè)字符串,詳細(xì)的代碼如下:
    在上面的.NET組件當(dāng)中我們實(shí)現(xiàn)了一個(gè)類成員:say。他的用途是簡(jiǎn)單的返回一段字符串。
    切換到MS-DOS命令行下面,運(yùn)行:
    C:\>csc /t:library /out ClassLibrary1.DLLClassLibrary1.cs
    上面的編譯器參數(shù)/t:library 告訴C#編譯器我們現(xiàn)在是在建立一個(gè)庫(kù)應(yīng)用程序。這樣,我們就得到了一個(gè)名稱為ClassLibrary1.DLL的.NET組件了。
    但是想要在現(xiàn)有的COM組件中使用這個(gè)組件,我們還有進(jìn)行如下步驟:
    切換到MS-DOS命令行下面,運(yùn)行:
    C:\>regasm out ClassLibrary1.DLL /regfile:ClassLibrary1.reg
    上面的命令行是注冊(cè)我們的.NET組件,并且產(chǎn)生了一個(gè)備用的注冊(cè)表文件。大家一定會(huì)記得在以前我們的win9x/NT/2000下面注冊(cè)COM組件使用的命令是:
    regsvr32 c:\test.dll