2010-10-21 98 views
0

我使用Wix 3.5 Votive(visual studio集成)爲某些COM對象創建安裝程序。獲取Wix Votive註冊COM對象

在Votive中,設置項目引用會從該項目中獲取二進制文件,並在編譯時自動生成Wix源文件。這非常棒,它是乾的,意味着我不必不斷更新Wix XML。 Votive生成的片段如下所示:

<Fragment> 
    <DirectoryRef Id="INSTALLLOCATION"> 
     <Component Id="cmpBCE83EAB1AAF2230E306A7325EE7EA11" Guid="*"> 
      <File Id="fil61D40E7D1A1D0A60C27CE6960FED2B0B" Source="$(var.My.Assembly.TargetDir)\My.Assembly.dll" /> 
     </Component> 
    </DirectoryRef> 
</Fragment> 

它對源文件,文檔和衛星也是如此,我沒有使用它們。然而,它沒有做的是爲COM註冊生成註冊表實體(該程序集標記爲'COM Visible'和'註冊COM Interop',但Votive似乎沒有處理這種機制。

Votive在幕後調用了Heat.exe來收集所有這些東西,並且在組件上調用Heat時會吐出一個包含<Class .../><RegistryValue .../>條目的文件,這正是COM註冊所需要的。足夠的話,Heat可以生成這些東西,這樣做很簡單,並且可以將輸出編輯到Wix項目中。但是,這違反了DRY原則,並且需要手動將Wix項目與源代碼保持一致。有點切線,我寧願讓Votive/MSBuild自動完成這項工作,每次解決方案都會建立。

我不是任何MSBuild專家,我正在與Wix,Votive和MSBuild進行大規模的學習。我花了幾天時間才達到目標。所以,我的問題是:每當解決方案建立時,Votive/MSBuild生成此COM註冊東西是否有直接的方法?我預計對於每個引用的項目,如果設置了「Register for COM Interop」選項,那麼Votive/MSBuild將爲該項目的輸出組件生成COM註冊內容。有沒有人做到這一點,如果是的話,請在我的大腦變成果凍之前,給我一個援助之手!

回答

1

我不相信這些都應該完成,因爲它消除了我喜歡在我的安裝程序中看到的更改控制/確定性行爲。我想知道安裝中的每個文件/資源​​都明確地放入安裝程序中,並且它不會被魔法浮動。我想明確收集和編寫我的COM元數據,以便我知道它是正確的。當您執行「在生成時提取COM」(InstallShield術語)時,進程可能因任何原因而失敗,然後最終得到一個看起來不錯的安裝,並且安裝不當,無法正確部署。你可以引用DRY prinicipal,但是在這個領域中,這些規則的應用有點不同。

+0

我完全明白你的觀點,但我的方法是由客戶的要求決定的,我的情況表明我儘可能簡化和儘可能自動化流程,我需要生成一個模板安裝項目,它可以很容易複製了許多項目,並由**缺乏經驗的愛好者程序員使用**告訴他們手動編輯他們的COM註冊將失敗Wix的學習曲線非常龐大,我無法對我的「客戶」造成這樣的影響因此,除非有人提出了更好的解決方案 – 2010-10-22 12:49:59

+0

如果這是一款iPhone,但在Windows上它永遠不會發生,您可能有機會安裝很複雜,因爲底層平臺和技術堆棧很複雜。運行安裝嚮導很容易,寫一個不是。大多數開發人員討厭安裝,因爲它很難和無聊。如果任何人都可以用一個簡單的按鈕將它抽象出來,它就已經完成了。 – 2010-10-22 23:07:51

+0

我一直拖着踢和尖叫到相同的結論。所以我接受了這個答案。 – 2011-11-09 23:06:23

0

從Wix 3.0(至少)開始看來,如果庫在網絡驅動器上編譯,則無法生成COM互操作元素。在使用.NET 2.0或.NET 4.0進行編譯時,我發現了相同的行爲。切換回建立一個本地驅動器(例如,C:)這個問題在.NET 2.0和.NET 4.0程序集中消失。

我還沒有找到一個很好的解決方法,而不是確保它在本地驅動器上。 :(