2011-11-01 19 views
2

嘗試構建MSM時遇到了此問題。在模塊生成過程中,通過在名稱末尾添加模塊GUID,模塊屬性(以及所有標識符)顯然會被重命名。例如,屬性「MY_PROPERTY」被重命名爲「MY_PROPERTY.803A3089_928F_46F1_BBAE_CBD39A7D6A72」(假設803A3089-928F-46F1-BBAE-CBD39A7D6A72是模塊GUID)。我相信這是用來防止多個模塊嘗試使用具有相同名稱的標識符之間的衝突的機制。MSI:從合併模塊(MSM)中的自定義操作讀取屬性

從MSM內部我需要調用一個DLL自定義操作,需要一個特定的屬性設置一些值(讓我們稱之爲「THE_PROPERTY」)。問題在於THE_PROPERTY被重命名爲THE_PROPERTY.803A3089_928F_46F1_BBAE_CBD39A7D6A72,因此自定義操作從未找到該屬性並失敗。

有什麼辦法可以解決這個問題嗎?我正在考慮修改自定義操作,以便試圖找出(以某種方式)調用它的模塊的GUID。這樣做的一種方法是查看當前操作名稱,其中還應包含GUID。但是,我可以從自定義操作中獲取當前操作名稱嗎?你能想到另一種解決方案嗎?

謝謝!

回答

2

事實上,通過在屬性名稱後面使用模塊GUID來訪問合併模塊中的屬性。

一個好的解決方案是使自定義操作訪問THE_PROPERTY.803A3089_928F_46F1_BBAE_CBD39A7D6A72而不是THE_PROPERTY。

另一種解決方案是使用一個type 51 custom action

  • 在MSI創建一個屬性與格式化自定義動作(類型51)
  • 其配置爲設置THE_PROPERTY設置:

    [THE_PROPERTY .803A3089_928F_46F1_BBAE_CBD39A7D6A72]

  • 在自定義操作之前計劃它,該操作讀取THE_PROPERTY

這種方式將合併模塊屬性保存到您的自定義操作使用的名稱的MSI屬性。

爲每個設置創作工具添加不同的51類自定義動作。如果您需要確切的說明,請提及您正在使用的安裝工具。 Visual Studio不支持這一點。

+0

感謝您的回答。解決方案#1對我來說不好,因爲這個自定義動作DLL是通用的,所以我無法在其中硬編碼一個GUID。這就是爲什麼我想知道是否可以從自定義操作中獲取此GUID(例如,通過讀取操作名稱,然後從中提取GUID)。解決方案#2也不好,因爲我必須在MSI中包含來自MSM的邏輯。我的意思是,如果我必須在MSI中包含一些邏輯,MSM有什麼好處?順便說一下,我在Visual Studio上使用了WiX 3.0。 – Paul

+1

然後你幾乎卡住了。要麼找到一種方法將GUID傳遞給自定義操作,或者找到設置MSI屬性的方法。沒有其他解決方案。此外,MSM GUID與您的自定義操作沒有任何關聯,因此您無法從某處取出它。你可以嘗試,但它不可靠。此GUID通常是硬編碼的,例如作爲自定義操作參數。 –

+1

自定義操作是否可以查看正在調用它的操作的名稱?再次感謝。 – Paul

相關問題