2012-10-16

用.Net寫COM元件的經驗談

有個舊平台的應用程式引用第三方DLL元件,不知何故,該元件有時會無法下載檔案,導致程式無法執行後續流程,因為該DLL的功能僅僅是為了下載檔案使用,這對 .Net 來說是輕而易舉,因此決定換掉該 DLL,使用 .Net 撰寫的DLL取代。

早期的程式平台當然是無法直接使用 .Net 的 Class Library,所以需要寫成 COM 元件;保哥的「用 .NET 寫 COM 元件的注意事項」這篇文章幫助甚大,不過因時空環境的差異,略為修改了部分步驟以符合實際狀況(粗體字為不同的步驟):

1.開啟 Visual Studio 2010
2.新增 類別庫(Class Library) 專案
3.在專案屬性中的「建置」(Build)頁籤,勾選「註冊 COM Interop」 (Register for COM interop)


4.註冊 COM 的 Module 名稱為 Class 的 [Namespace].[ClassName]
5.類別(Class)要引入 System.Runtime.InteropServices 命名空間
6.在類別定義的地方要加上 [ComVisible(true)] 屬性

程式撰寫上沒有碰到特別的困難,接著進行「手動部署」:
gacutil /i DownloadCOM.dll
Regasm.exe DownloadCOM.dll /tlb:DownloadCOM.tlb /register
但遇到這個錯誤:「無法將組件新增至快取: 嘗試安裝沒有強式名稱的組件」。

保哥在回應裡提及:「要將組件註冊進 GAC 是一定要設定強式名稱金鑰的
所以對專案進行「簽署」動作,產生一組金鑰:

7.在專案屬性中的「簽署」頁籤,設定強式名稱(Strong Name)金鑰。(我是直接「新增」)

這樣就OK了嗎? 

當然.......沒有! (笑)

由於 Regasm.exe 這個執行檔,要安裝  Visual Studio 或是 Windows SDK 才會有

測試環境並沒有此執行檔,為了不增加部署上的麻煩(其實是不懂趕快找台階下...XD),後續步驟與保哥不太相同,而是採用「安裝專案」來進行「自動部署」:

8.新增「安裝專案」

9.設定安裝專案的「主要輸出」,並確認「Register」為「vsdrpCOM」(預設值)



部署之後,舊的應用程式配合修改引用的DLL就大功告成!!

非常謝謝保哥的文章,減少我許多摸索的時間,藉此也學到不少COM元件的眉眉角角。

為了救火,並沒有深入研究相關原理,之後有時間的話,想要改寫成免註冊的COM Interop,留下一些線索供以後參考。


參考連結:

COM Interop:
免註冊的COM Interop:
FoxPro 介接 COM Interop
.Net 下載檔案方法:

沒有留言:

張貼留言

引用 Topshelf 無法進行偵錯的經驗

Topshelf  是一個可以簡化撰寫 Windows Service 的套件,引用之後,我們只要當作撰寫一般 Console 的應用程式就可以。 只是近來撰寫上遇到無法進行Debug的狀況,在Visual Studio一進行偵錯可以看到Console 程式被執行,並顯示...