VS2003呼叫VS2005的COM DLL

在.net的環境寫作程式預設就提供了相當多的類別可供使用,寫作程式上也變的相當的方便,但有時候會遇到舊系統的需求新增,或是必須要撰寫DLL(組件)來讓其他使用者做使用的情形;而在這樣的情況,通常會撰寫類別庫,也就是產生出DLL的檔案來供其他人方便使用。而在使用.Net DLL時,在相同版本的.net framework也很方便,只要用加入參考的方式將該DLL加入參考後,就可以開始使用相關的功能;但是在VS2003與VS2005之間互通時卻無法使用加入參考的方式去做,又或者當我們必須要將DLL提供給網頁、VB6這樣的開發環境時,該怎麼辦呢?這篇主要說明一下在VS2003的環境(.net framework 1.1)要怎麼樣去使用VS2005(.net framework 2.0)的COM DLL

在.net的環境寫作程式預設就提供了相當多的類別可供使用,寫作程式上也變的相當的方便,但有時候會遇到舊系統的需求新增,或是必須要撰寫DLL(組件)來讓其他使用者做使用的情形;而在這樣的情況,通常會撰寫類別庫,也就是產生出DLL的檔案來供其他人方便使用。而在使用.Net DLL時,在相同版本的.net framework也很方便,只要用加入參考的方式將該DLL加入參考後,就可以開始使用相關的功能;但是在VS2003與VS2005之間互通時卻無法使用加入參考的方式去做,又或者當我們必須要將DLL提供給網頁、VB6這樣的開發環境時,該怎麼辦呢?這篇主要說明一下在VS2003的環境(.net framework 1.1)要怎麼樣去使用VS2005(.net framework 2.0)的COM DLL。

在進入主題之前,這邊先說明一下當要將DLL提供給網頁(ASP)或是VB6使用時應該要怎麼做;在後續同樣的也必須要經過這些步驟才能順利的讓VS2003使用相關的DLL。

首先,要開放給像是VB6這樣的程式使用時,必須要將DLL開放COM介面,讓其他的程式透過COM介面來呼叫,而要怎麼實作呢?請參考Will保哥的文章,相當的清楚,位置再下面這邊
http://blog.miniasp.com/post/2008/07/How-to-write-COM-component-using-NET.aspx
這邊補充一個部分,要將.net組件加入到GAC中時,必須要簽署組件,也就是設定強式名稱(Strong Name),不然會加不進去,簽署的位置會像下圖這樣

好,那麼參考完保哥的文章後,相信大家都可以實作出COM DLL了,接下來就是如何在VS2003中去使用了。

在將相關的DLL安裝到系統上之後,開啟VS2003,選擇加入參考之後,在選單中可以看到我們註冊到系統中的DLL,但是選取後卻會得到一個無情的錯誤

沒關係,沒辦法從IDE加入,還有CreateObject可以使用,所以用了像下面這樣的方式


Dim A As Object = CreateObject("NameSpace.ClassName")

結果卻得到了一個無法產生ActiveX的錯誤訊息,怎麼會這樣呢,主要就是因為.net framework版本的關係;那要怎麼去解決呢?可以參考下面這篇的方式
http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/566fa1b5-9c99-4b11-9ccd-c72b657dcc66
其中,我截錄幾個重點說明
When your client's .NET 1.1 application trying to call your .NET 2.0 made COM component, the CLR 2.0 will need to be loaded into the running process. However, since CLR 1.1 is already loaded in current process, since CLR 1.1 & 2.0 don't support co-existence in the same process, the latter loaded CLR will always fail. So your .NET 2.0 COM component fails at initialization, and you got a "Cannot Create ActiveX component" message. When you use CreateObject from VB6, it works fine because in this case there is no CLR 1.1 & 2.0 conflict in the same process
解決的方式就是要在VS2003中加入組態檔,例如下面這樣

之後在組態檔案中加入下面內容(請自行將xml的括號替換為正確的"<" & ">"


[?xml version="1.0" encoding="utf-8" ?]
[configuration]
    [startup]
        [supportedRuntime version="v2.0.50727"/]
    [/startup]
[/configuration]

這樣就可以順利的載入.net framework 2.0的DLL檔案了;不過還有幾個要注意的地方
1. Client環境必須要同時安裝.net framework 2.0 & 1.1
2. 由於是利用CreateObject的方式,程式撰寫過程沒有Intelisence可以使用
3. 偵錯模式不能跑,要直接執行exe檔才能夠看的到效果

雖然有這些缺點,不過是可以使用的,遇到這樣的情形,就可以評估看看是要用VS2003來改寫呢,還是用COM的方式了。

相關參考資料