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