溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時間:2020-07-17 01:34:11 來源:網(wǎng)絡(luò) 閱讀:1270 作者:OH51888 欄目:編程語言

.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)當(dāng)盡量避免使用共享的.NET組件,因為這樣將會有可能再一次的陷入目前在視窗系統(tǒng)下長期困擾開發(fā)人員的“DLL地獄”。 
    私有的.NET組件是我們將會經(jīng)常使用的.NET組件方式,在這種方式之下,我們發(fā)布.NET組件需要做的只是簡單的進行拷貝操作就可以了,仿佛回到了遠古的DOS時代了,在也不必關(guān)心紛繁復(fù)雜的系統(tǒng)注冊表了,也不必擔(dān)心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組件當(dāng)中我們實現(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 
    在.NET下面,注冊.NET組件就需要上面的regasm命令了,值得注意的是,這個方法僅僅是為了可供COM組件來調(diào)用,.NET本身之間相互調(diào)用組件是不需要任何注冊的! 
    還沒有結(jié)束呢,接下來我們需要:
切換到MS-DOS命令行下面,運行:
C:\>tlbExp ClassLibrary1.dll /out:ClassLibrary1.tlb
上面的命令行表示將會產(chǎn)生一個.NET組件的類型庫,目的是為了我們在COM組件中進行提前綁定操作。
好了,接下來我們就可以在自己的基于目前COM技術(shù)的代碼中方便的使用上面我們使用C#編寫的.NET組件了。在這里,我們使用VB6.0編寫一個小小的 測試代碼,在開始之前我們需要在VB的集成環(huán)境中使用菜單中的“引用”選項,選擇我們剛才產(chǎn)生的類型庫文件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
接下來,我們就來看看,如何在.NET組件中使用目前存在的COM組件吧。
對于.NET來講,使用COM組件要想對簡單一些。.NET在設(shè)計之初就考慮到了如何方便的利用現(xiàn)有的各種技術(shù)資源,這也是微軟的一貫作風(fēng),.NET的強 大之處也可見一斑。.NET提供了大量的類庫來方便的實現(xiàn)同COM的相互操作,其中很重要的一個名稱空間就是: System.Runtime.InteropServices。通過這個名稱空間的名字我們也可以從字面上看出,“互操作服務(wù)”。 System.Runtime.InteropServices這個名稱空間提供了一系列的類來對COM對象進行操作。
下面的例子中,我們來調(diào)用一下系統(tǒng)自帶的Win32函數(shù)MessageBoxA,這個函數(shù)位于系統(tǒng)的COM組件user32.dll當(dāng)中,我們調(diào)用的代碼如下:
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#應(yīng)用程序之后,直接運行就可以看到對話框了!
需要注意的是,在調(diào)用COM組件之前,我們需要在.NET程序中引用名稱空間:System.Runtime.InteropServices。因為我們需要使用這個名稱空間所提供的一個方法:DllImport。
怎么樣,在.NET中使用COM組件是非常的方便的吧。上面是我們調(diào)用的系統(tǒng)本身自帶的DLL組件,同樣的,也可以使用這種方法來調(diào)用我們自己使用VB/VC編寫的COM組件。

好了,我們已經(jīng)探討完了如何在.NET和COM之間相互操作了,我們也很顯然的看到了.NET技術(shù)的強大,現(xiàn)在越早掌握.NET技術(shù)就會在未來越容易的占領(lǐng)領(lǐng)先的位置,讓我們共同努力掌握強大的.NET平臺技術(shù)吧。
(以上程序在Windows2000 server+VS.NET Beta2下測試通過)
----------------------
相關(guān)知識
以下是com的概念 
什么是com
Components   Object   Model   (COM)   是軟件組件互相通訊的一種方式。它是一種二進制和網(wǎng)絡(luò)標準,允許任意兩個組件互相通訊,而不管它們是在什么計算機上運行(只要計算機是相連的),不管各計 算機運行的是什么*作系統(tǒng)(只要該*作系統(tǒng)支持   COM),也不管該組件是用什么語言編寫的。COM   還提供了位置透明性:當(dāng)您編寫組件時,其他組件是進程內(nèi)   DLL、本地   EXE   還是位于其他計算機上的組件,對您而言都無所謂。(當(dāng)然會有性能區(qū)別,但是,即使改變了其他組件的位置,您也不必重新編寫什么,這是關(guān)鍵所在。)
COM   是基于對象的——但是這種對象概念與您熟悉的   C++   或   Visual   Basic   中的對象不太一樣。(順便說一下,“對象”和“組件”幾乎是同一個東西。GUI   醫(yī)生在談?wù)搼?yīng)用程序的結(jié)構(gòu)時愿意說成“組件”,而在談?wù)搶崿F(xiàn)時愿意說成是“對象”)
首先,COM   對象被很好地封裝起來。您無法訪問對象的內(nèi)部實現(xiàn)細節(jié);您無法知道對象使用了什么數(shù)據(jù)結(jié)構(gòu)。實際上,對象的封裝是如此的嚴密,以致于   COM   對象通常被描繪為盒子。圖   1   描繪了一個完全封裝的對象。請注意,實現(xiàn)細節(jié)是如何向您隱藏的。
Windows   2000中的 Component   Services是企業(yè)級應(yīng)用中的非常重要的一部分,它為那些基于web的、分布式的應(yīng)用程序提供了幾乎所有需要的功能。盡管 COM+服務(wù)起初只是被設(shè)計 用來為COM組件提供服務(wù)的,但是如果.NET組件也能夠使用COM+服務(wù)的話,那將會是一件很好的事。因為COM+能夠為組件提供很多服務(wù)如對象緩沖, 資源共享,給予角色的安全機制和分布式事務(wù)處理等。
概括地說,COM具有如下一些優(yōu)越性:
編程技術(shù)難度和工作量降低,開發(fā)周期變短,開發(fā)成本降低。一般編程人員只須根據(jù)應(yīng)用功能要求選用合適的組件,而不必事無巨細都自己動手去完成。組件模塊將編程的技術(shù)難度和工作量在人員個體和時間上進行了分攤。
可以實現(xiàn)分層次的編程,從而促進了軟件的專業(yè)化生產(chǎn)。專業(yè)人員可以開發(fā)出具有很強專業(yè)性的軟件組件,這樣既保證了普通的編程應(yīng)用人員能夠完成所需要的應(yīng)用開發(fā),又不至于降低使用的性能。應(yīng)用人員不便實現(xiàn)的組件模塊可以讓專業(yè)人員定做。
促進組件市場的豐富,最大限度地滿足了各種應(yīng)用需求,定制特定的軟件模塊變得相當(dāng)容易。
軟件的復(fù)用率提高,使軟件的使用效率得到提高并延長了使用壽命。組件編程體系使大量的編程問題局部化了,使軟件的更新和維護變得快速和容易,軟件的成本大大降低。

什么是COM?
2007-07-30 23:33
什么是COM?
    所謂 COM(Componet Object Model,組件對象模型),是一種說明如何建立可動態(tài)互變組件的規(guī)范,此規(guī)范提供了為保證能夠互操作,客戶和組件應(yīng)遵循的一些二進制和網(wǎng)絡(luò)標準。通過這 種標準將可以在任意兩個組件之間進行通信而不用考慮其所處的操作環(huán)境是否相同、使用的開發(fā)語言是否一致以及是否運行于同一臺計算機。
COM的優(yōu)點?
      首先:用戶一般希望能夠定制所用的應(yīng)用程序,而組件技術(shù)從本質(zhì)上講就是可被定制的,因而用戶可以用更能滿足他們需要的某個組件來替換原來的那個。其次,由 于組件是相對應(yīng)用程序獨立的部件,我們可以在不同的程序中使用同一個組件而不會產(chǎn)生任何問題,軟件的可重用性將大大的得到增強。第三,隨著網(wǎng)絡(luò)帶寬及其重 要性的提高,分布式網(wǎng)絡(luò)應(yīng)用程序毫無疑問的成為軟件市場上越來越重要的買點。組件價構(gòu)可以使得開發(fā)這類應(yīng)用程序的過程得以簡化。
什么是COM+?
      COM+并不是COM的簡單升級,COM+的底層結(jié)構(gòu)仍然以COM為基礎(chǔ),它幾乎包容了COM的所有內(nèi)容,COM+綜合了COM、DCOM和MTS這些技 術(shù)要素,它把COM組件軟件提升到應(yīng)用層而不再是底層的軟件結(jié)構(gòu),它通過操作系統(tǒng)的各種支持,使組件對象模型建立在應(yīng)用層上,把所有組件的底層細節(jié)留給操 作系統(tǒng),因此,COM+與操作系統(tǒng)的結(jié)合更加緊密。
      COM+不再局限于COM的組件技術(shù),它更加注重于分布式網(wǎng)絡(luò)應(yīng)用的設(shè)計和實現(xiàn)。COM+繼承了COM幾乎全部的優(yōu)勢,同時又避免了COM實現(xiàn)方面的一些 不足,把COM、DCOM和MTS的編程模型結(jié)合起來,繼承了它們的絕大多數(shù)特性,在原有的特性上增加了新的功能。
COM+的新的優(yōu)點?
      以下列出COM+的幾個主要特性:
      COM+不僅繼承了COM所有的優(yōu)點,而且還增加了一些服務(wù),比如隊列服務(wù)、負載平衡、內(nèi)存數(shù)據(jù)庫、事件服務(wù)等。
  隊列服務(wù)對于分布式應(yīng)用非常有意義,特別是在現(xiàn)在網(wǎng)絡(luò)速度很慢的情況下,這種機制可以保證應(yīng)用系統(tǒng)能夠可靠地運行。在應(yīng)用系統(tǒng)包含大量節(jié)點但服務(wù)器又繁忙的情況下,客戶應(yīng)用程序可以把它們的請求放到隊列中,當(dāng)服務(wù)器負載比較輕的時候再處理這些請求;
  又如COM+提供了負載平衡服務(wù),它可以實現(xiàn)動態(tài)負載平衡,而且COM+應(yīng)用程序的負載平衡特性并不需要編寫代碼來支持,客戶程序和組件程序都可以按通常 的方式實現(xiàn)。獲得負載平衡特性并不是用程序設(shè)計的方式來實現(xiàn)的,而是通過配置實現(xiàn)分布式應(yīng)用程序的負載平衡,如上所講的隊列服務(wù),其實也反映了一種負載平 衡。
     (1) 真正的異步通訊。COM+底層提供了隊列組件服務(wù),這使客戶和組件有可能在不同的時間點上協(xié)同工作,COM+應(yīng)用無須增加代碼就可以獲得這樣的特性。
     (2) 事件服務(wù)。新的事件機制使事件源和事件接收方實現(xiàn)事件功能更加靈活,利用系統(tǒng)服務(wù)簡化了事件模型,避免了COM可連接對象機制的瑣碎細節(jié)。

(3) 可伸縮性。COM+的可伸縮性來源于多個方面,動態(tài)負載平衡以及內(nèi)存數(shù)據(jù)庫、對象池等系統(tǒng)服務(wù)都為COM+的可伸縮性提供了技術(shù)基礎(chǔ),COM+的可伸縮性原理上與多層結(jié)構(gòu)的可伸縮特性一致。
     (4) 可管理和可配置性。管理和配置是應(yīng)用系統(tǒng)開發(fā)完成后的行為,在軟件維護成本不斷增加的今天,COM+應(yīng)用將有助于軟件廠商和用戶減少這方面的投入。
     (5) 易于開發(fā)。COM+應(yīng)用開發(fā)的復(fù)雜性和難易程度將決定COM+的成功與否,雖然COM+開發(fā)模型比以前的COM組件開發(fā)更為簡化,但真正提高開發(fā)效率仍需要借助于一些優(yōu)秀的開發(fā)工具。
      COM+ 標志著Microsoft的組件技術(shù)達到了一個新的高度,它不再局限于一臺機器上的桌面系統(tǒng),它把目標指向了更為廣闊的企業(yè)內(nèi)部網(wǎng),甚至 Internet國際互連網(wǎng)絡(luò)。COM+與多層結(jié)構(gòu)模型以及Windows操作系統(tǒng)為企業(yè)應(yīng)用或Web應(yīng)用提供了一套完整的解決方案。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI