2012-08-13 154 views
1

我被一個VB6程序員提供了一個需求(是的,他們仍然存在)。有一個vb6應用程序使用vb6 dll,這個dll現在使用一個.net dll,它使用另一個.net dll。現在我的要求是.net dll應該像vb dll一樣工作,即一旦註冊了vb6 dll,它可以被其他應用程序使用,並且在推出時不需要包含它(所以我被告知)。有沒有辦法將我的.net dll放到其他vb6應用程序可以使用它。從我看到的這隻有在我的.net dll與我的vb6 exe文件位於同一個文件夾時纔有效。如何集中一個VB6引用的.net dll(com interop)dll

我已閱讀本How Does a COM Program Locate a .NET DLL Registered for COM Interop?

謝謝

回答

4

COM是其DLL地獄問題相當臭名昭著。機器上所有程序的註冊是全球性的。因此,替換DLL通常最終會破壞使用COM服務器的其他程序。

.NET有一個對策,當您運行Regasm.exe註冊[ComVisible] .NET程序集時,默認情況下會將程序集放到GAC中。它會自動購買DLL地獄保護。然而,這並不罕見,特別是在您的開發機器上,也是由IDE完成的,用/ codebase選項註冊程序集。

但是現在你會遇到一個新問題,CLR沒有很好的機制來定位相關的.NET程序集。探測路徑基於EXE,COM客戶端。這就是爲什麼將您的相關程序集複製到EXE安裝目錄中的原因。

這對測試很好,但不是您在部署服務器時想要使用的良好通用解決方案。您無法準確預測EXE將使用COM服務器以及它所在的位置。搞亂其他人擁有的程序的安裝目錄往往在政治上很困難。

使用GAC,解決所有問題。

+0

我喜歡短語「政治上困難」。有趣的是,在大公司的編程中有很多政治因素。這是糟糕的經理人的結果。 – David 2012-08-14 09:18:49