2009-10-20 96 views
1

在VB6 ActiveX exe項目中,是否有任何方法可以在添加新事件時保留事件調度接口的GUID?VB6二進制兼容性 - 添加新事件

顯然,改變現有事件會打破兼容性。添加一個新的不會導致VB6 IDE發出警告。但是,這並不令我感到驚訝,因爲它在添加新方法時也不會警告,但至少現有方法保留其GUID。

有了事件,如果以後添加新事件,似乎沒有辦法保留現有事務的向後兼容性。

對於通過COM集成的VB6應用程序來說,這似乎不成問題;我假設VB運行時做了一些聰明的事情,通過註冊表來獲取事件,而不需要事先知道GUID。

如果其他應用程序是.Net(特別是C#),並且我必須手動聲明接口以實現事件接收器,我希望GUID保持不變以避免重新編碼i/f每當VB6應用程序擴展。我可能既不知道也不關心VB6應用程序中新實現的事件 - 我只是希望能夠繼續使用預先存在的事件,而無需更改.Net源代碼。

是否有一些VB6技巧,我錯過了這將使我能做到這一點?

回答

0

我從來沒有找到一種方法來防止添加事件時發生破壞的兼容性。不幸的是,這是我第一次得到正確的東西之一(獲取所有新事件,參數等),這樣當我破壞兼容性時,我只需要經歷一次這種痛苦。

0

恐怕我還沒有找到任何方法來保持GUID常量,當改變事件..但如果你只是在.NET應用程序中使用VB6程序集,你可以tlbimp VB6 DLL每個當你重新創建它,然後創建一個引用,而不是用手寫在.NET中的接口?

+0

可能,但我真正追求的是修改VB6應用程序的方式,這並不意味着我們的.Net應用程序(以及任何第三方應用程序也與傳統的VB6應用程序集成在一起)幾個)需要感動,除非我們/他們想要實施新的事件。 –

+0

檢查VB6 Service Pack 7的狀態 - 不會發生。 –

2

問題是,一旦定義了COM接口是不變的。但是COM有版本控制,以便可以將舊版界面設置爲與新界面兼容。

Visual BASIC在幕後做了什麼創建了一個新版本的com界面。更新版本號,添加新方法並設置所需信息,以便新界面可以自動與舊界面一起使用。

正如它指出的那樣,事件並不是自動完成的。我使用了Visual Studio OLE/COM對象視圖並查看GUID更改。

混合VB6/.NET的一個可能的解決方案是有點痛苦,但保持一切清晰,當你做出改變。首先,您需要使用OLE/COM對象視圖來獲取VB6對象的IDL。然後使用MIDL編譯器生成一個typelib。從現在起使用typelib作爲參考。

您將不得不重新命名接口,因爲它將與VB6名稱衝突。這個想法是.NET和VB6都會引用typelib並實現接口。任何時候當你想更新接口時,你都要改變IDL,重新編譯typelib並實現兩者的接口。

現在,如果這聽起來有點複雜,並離開將WFT!?我不怪你。但在我自己的轉換項目中,我發現它在某些情況下很有用,當時VB6的東西還在持續開發中,但您需要使用它。NET

現在,一個簡化器解決方案可以識別和分離兩個組件互操作所需的最低限度。說事件和一些合適的東西。爲該接口生成IDL。編譯一個typelib並將其用作參考。我也這樣做了。

+0

非常有趣的解決方案! – Ant

+0

這種方法不會失效嗎,因爲你不能用這種方式實現事件嗎? http://msdn.microsoft.com/en-us/library/aa262327%28VS.60%29.aspx –