2013-08-16 47 views
6

我寫了一個簡單的.NET項目(類庫),它是COM可見的。它適用於VB6!使用ClassInterfaceType.AutoDual真的是一個壞主意,即使使用VB6?

代碼看起來像以下:

[ComVisible(true)] 
[ClassInterface(ClassInterfaceType::AutoDual)] 
public ref class MyObject 
{ 
    // Some methods and values 
} 

的組件正確簽名(如果它不是在GAC不要求),註冊(regasm MyProject.dll /tlb /codebase)。

然後,我的VB6項目中引用TLB文件,一切都OK!我可以訪問我的課程和他們內部的公共方法。

在互聯網上,很多人都說使用ClassInterfaceType::AutoDual不是一個好主意,因爲版本的潛在問題可能會破壞使用程序集的應用程序。

但是,就我而言,這是否真的有問題?此程序集僅用於VB6項目(在早期綁定中)。

在每一個新版本中,我都會返回這些步驟(簽名,註冊等)。這個解決方案可以是任何版本問題嗎?

無論如何,我可以寫一些[GUID("...")]屬性嗎?

GUID由Visual Studio自動生成,所以類在每次編譯時都不是相同的GUID。這樣對嗎?

回答

11

如果您不使用AutoDual,VB6中的早期綁定無法工作。此外,自動完成功能不再適用於VB6編輯器,因此鍵入導致運行時錯誤的錯誤的風險更高。 VB6程序員往往習慣於這樣做,所以可能會堅持這一點。

當然,這是有風險的。如果更新了COM服務器,並指定了[Guid]而沒有更新它,那麼VB6程序將在運行時崩潰並帶有完全不可知的錯誤。或者更糟糕的是,根本就不會崩潰,而是稱完全錯誤的方法。

如果讓.NET自動生成[Guid],強烈推薦,那麼在運行時您不會遇到硬件崩潰,但「ActiveX組件無法創建對象」錯誤。哪一點更有幫助,當然也更不危險,但是在哪裏尋找問題時可以爲您或用戶提供很少的指導。

如果使用ComInterfaceType.InterfaceIsIDispatch,則VB6程序員被迫使用晚期綁定並使用GetObject()創建對象。 [Guid]已經不再重要了,如果更改不太過分,現有的VB6代碼仍然可以使用COM服務器的可能性更高。如果某種方法獲得了額外的論證,它仍然會發生爆炸。它會有一個更好的運行時錯誤。當然,這並不能解決VB6程序員不重視的方法邏輯的改變。一個缺點是方法調用會很慢。

+0

感謝您的回覆!澄清,在項目中,目標是:1)在VB6中使用Intellisense 2)使用這樣的對象:'Dim myobj As New MyObject'。那麼我的解決方案很好,不是嗎? –

+2

我已經在我的回答中介紹過,自動完成和IntelliSense是一樣的,你不想使用GetObject。顯然你堅持使用AutoDual。 –

+0

非常感謝!簡而言之,如果我正確卸載並重新安裝程序集(使用'regasm'),那麼即使使用自動生成的GUID和AutoDual,它們也不會出現版本控制問題。 DispID如何? –

相關問題