簡體   English   中英

ActiveX / COM / VB6企業項目的構建過程

[英]Buildprocess for ActiveX / COM / VB6 enterprise projects

我們使用微軟的ActiveX / COM(VB6)技術開發了一個軟件系統。 在過去的一年里,我對整個自動化構建流程和SCM越來越感興趣。 我仔細搜索了網絡的大部分內容,以獲取有關如何使用基於COM的軟件系統進行scm的最佳實踐的信息。

COM的“問題”是,引用組件通過唯一的接口ID保存引用。 重新編譯引用的組件時,id可能會更改,並且引用不再有效。 這里的主要問題是,iid被編譯成二進制文件。 因此,當我不想將已編譯的文件簽入版本控制時,每個開發人員都必須編譯他/她自己的版本並獲取其他ID。

當我想在干凈的構建機器上檢查源代碼來編譯系統時,它是不可能的,因為所有引用都是無效的(沒有二進制文件,沒有接口ID)。

我只是想知道,如果有一些最佳實踐,如何為COM項目(VB6)設置自動構建系統?

編輯:是的,我知道兼容性設置。 但是采取這種情況,我想在沒有任何二進制文件的干凈構建機器上構建wohle系統。 當您說項目是二進制兼容的時,您必須提供與項目兼容的二進制文件。

我想我必須編寫一個自定義構建工具,它在編譯項目之前和之后修改項目文件中的引用和兼容性設置。

因為VB6 / COM是一種非常廣泛的技術,我只是認為必須有一個隨時可用的解決方案。

我們通常用二進制兼容性編譯。 當我們修改組件的公共接口時,我們使用項目兼容性進行編譯。 但是當您更改許多其他組件使用的基本組件的接口時,您必須手動將所有引用項目更改為項目兼容性,重新編譯它們並更改回二進制兼容性。 這是我想要自動化的主要過程。

您可以通過將項目的兼容性設置從“No Compatbility”更改為“Binary Compatibility”來告訴VB6重用GUID(IID的CLSID的LIBID等)。 您可以在Project-> Your-Project Properties下找到這些設置。 兼容性設置位於“項目屬性”窗口的“組件”選項卡上。 有三種選擇:

  • 沒有兼容性
  • 項目兼容性
  • 二進制兼容性

以下是MSDN對他們的評價:

沒有兼容性


使用此設置,不會強制執行兼容性。 每次構建或編譯項目時,Visual Basic都會創建新的接口ID和類ID。 構建的每個版本只能與創建的應用程序一起使用,以使用該組件的特定構建。

項目兼容性


使用此設置,可以使項目與特定組件項目兼容。 生成新類型庫信息時,將維護類型庫標識符,以便測試項目仍可引用組件項目。 此設置用於在測試期間保持兼容性。 因此,一旦組件被釋放,它的行為與無兼容性設置相同。

二進制兼容性


編譯項目時,Visual Basic僅在必要時創建新的類和接口ID。 它保留了先前版本的類和接口ID,以便使用早期版本編譯的程序將繼續工作。 如果您進行的更改將導致版本不兼容,Visual Basic將警告您。 如果要保持與較早發布的ActiveX組件版本的兼容性,則需要使用此設置。

聽起來你正在編譯沒有兼容性 正如MSDN文章所述,您需要使用二進制兼容性來保持組件的較新版本與舊版本兼容。 您現在可以通過執行以下操作來執行此操作:

  • 使用No Compatibility編譯每個項目一次

  • 將這些“干凈”版本保存到執行構建的人可以輕松訪問的文件夾(例如網絡共享),或者將它們放在源代碼管理中。

  • 返回並將所有項目更改為“二進制兼容性”並將“兼容文件”指向您剛剛保存在網絡/源代碼管理中的相應版本(不要將兼容文件指向您編譯的同一路徑兼容文件應該是原始組件的一個單獨的副本,它不會改變。它只存在,以便VB可以在重新編譯時將該文件的ID復制到你的項目中)。

每次重新編譯項目時,他們都將重用組件的兼容(原始)版本中的GUID。

編輯:正如Joe在評論中提到的那樣,你還必須認識到你的類接口何時發生了變化(也就是說,當接口發生了足夠的變化,你可以更長時間地保持與以前版本的二進制兼容性)。 發生這種情況時,您希望從以前版本的組件中徹底中斷:重新編譯新的“干凈”版本(即無兼容性)並在將來的版本中將該新版本用作兼容文件。 但是,重要的是要注意,只有在類接口(屬性和方法)發生更改時才能重新開始。 事實上,當項目不再與以前版本的組件兼容時,VB會發出警告。

如果你想生活在邊緣......


在我工作的地方,我們傾向於(ab)在我們的大多數項目中使用No Compatibility,即使它不是真正正確的做事方式(你應該使用二進制兼容性)。 在我們公司,它被收購了懶惰,因為我們有一個自動構建工具,可以為我們編譯所有項目,該工具的主要功能之一是可以自動修復項目之間的破壞項目引用。 由於構建工具為我們修復了此問題,因此使用二進制兼容性的動機較少。

為什么二進制兼容性更好(或者......為什么你不應該做我們做的事情)


二元兼容性通常是更好的選擇的幾個原因:

  • 微軟這么說

  • 如果所有組件都與以前版本的軟件二進制兼容,則可以輕松地重新編譯單個組件並將其重新分發給客戶。 這使得錯誤修正/補丁更容易部署。 如果在項目中使用No Compatibility,則每次需要修補小補丁時都必須重新編譯並重新分發整個應用程序,因為較新的組件(可能)不適用於較舊的組件。

  • 您正在盡力維護COM標准:在COM中,類ID和接口ID應該唯一地標識類或接口。 如果你的類和/或接口在構建之間沒有改變,那么就沒有理由為這些類和接口生成新的ID(事實上,那么同一個類將有多個ID)。 Binary Compatiblity允許您跨構建維護相同的ID,這意味着您是一個好公民並遵循COM約定。

  • 減少注冊表噪音。 如果您始終將新組件部署到與舊版本不二進制兼容的客戶,則每個新版本都會向注冊表添加新信息。 除其他外,每個新接口和類ID都必須注冊。 如果你保持Binary兼容的所有內容,那么安裝程序只需要在一個地方添加注冊表項,因為你的類ID和接口ID不會改變。

  • 如果您正在公開其他第三方應用程序正在使用的公共API或組件,您肯定希望使用二進制兼容性,這樣您就不會破壞依賴於您的代碼的第三方軟件。

Visual Build Pro 如果你仍然停留在VB6的土地上,並且必須建立專業產品,我強烈建議你研究一下這個產品。 它有一個免費試用,值得每一分錢(加上它為.Net和其他平台的持續集成做得非常好。)自從我們開始使用它以來,它已經從我們的DLL地獄中拯救了我們。 我不知道在VB6中創建一個像樣的構建盒。

正如Mike Spross建議的那樣,您應該使用二進制兼容性。 您可以(並且應該)在干凈的機器上構建。 您可以通過在源代碼管理系統的“兼容”目錄中保留當前生產二進制文件(ActiveX DLL和OCX)的副本來完成此操作。 選擇二進制可焊性時,所有項目都應參考此副本。 例如,將新二進制文件放入... \\ Release中,兼容的二進制文件位於... \\ Compatible。 當新版本投入生產時,您將所有內容從... \\ Release復制到... \\ Compatible。 通過這種方式,您可以保持從一個版本到下一個版本的兼容性。

在二進制兼容模式下,如果向類中添加新方法,VB將創建新的IID。 請記住,在COM中,接口是不可變的。 如果您對界面做了最輕微的更改,那么您正在創建新的東西。 VB遵守COM的這一規則,但使用一些冒煙和鏡像來防止破壞舊的客戶端代碼。 因為VB“知道”新接口是舊接口的100%超集(這是二進制兼容性確保的),所以它可以使用“接口轉發”。 接口轉發僅將所有引用從舊接口重定向到新接口。 如果沒有這個技巧,您必須創建您修改的任何ActiveX組件的新版本(具有不同的名稱和CLSID)。 DLL地獄會變成DLL Armargeddon!

VB將所有接口轉發信息存儲在組件的資源中。 注冊組件時,它會將所有接口IID寫入HKCR \\ Interface。 較舊的接口將包含轉發信息。 只有“真實”界面才會引用實際的coclass。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM