我有一個運行自定義操作的安裝項目。自定義操作本身使用臨時文件,這些文件在調用自定義操作之前由安裝程序複製。自定義操作完成後,這些文件將被刪除。Installshield/MSI在卸載過程中安裝臨時文件
在安裝階段一切正常。
我的問題是在卸載階段。另一個自定義操作被調用,它也需要訪問這些臨時文件。我的問題是如何在卸載階段在機器上覆制文件(暫時)?
在此先感謝。
我有一個運行自定義操作的安裝項目。自定義操作本身使用臨時文件,這些文件在調用自定義操作之前由安裝程序複製。自定義操作完成後,這些文件將被刪除。Installshield/MSI在卸載過程中安裝臨時文件
在安裝階段一切正常。
我的問題是在卸載階段。另一個自定義操作被調用,它也需要訪問這些臨時文件。我的問題是如何在卸載階段在機器上覆制文件(暫時)?
在此先感謝。
Windows Installer不支持臨時文件。所以我假設你只是安裝一些文件並在安裝結束時刪除它們。這不是一個好方法,因爲對於Windows Installer他們基本上缺少資源。
臨時文件正確的做法是將它們存儲在Binary表,並把它提取出來的安裝開始時和當它結束時刪除自定義操作。這由多個設置創作工具直接支持。
你的情況,你可以試試這個方法:
這種方式卸載自定義操作將有權訪問您的文件。
雖然什麼科斯明已回答必須是真實的,他似乎並不知道的InstallShield有一個叫做支持文件的功能,已經這樣做了,他描述的一切。將一些文件拖入安裝設計器|行爲和邏輯|支持文件|獨立於語言並且InstallShield將自動將它們流式傳輸到ISSetupFile表中,並對在安裝過程中將文件解壓縮到臨時目錄並在最後清理文件的自定義操作進行排序。
這些文件的位置可以使用[SUPPORTDIR]屬性中找到。如果您使用的是延遲自定義操作,那麼您將通過CustomActionData屬性對此進行序列化。
此外,如果您使用的是DTF自定義操作,則應該意識到,如果通過內容和複製的操作將內容添加到CA CSPROJ,則會將其打包並提取到當前要訪問的目錄而你的代碼正在執行。
謝謝克里斯託弗。我不知道支持文件功能;這非常有用。我知道在DTF自定義操作中打包文件,但這在我的方案中不起作用,因爲要部署的文件因安裝程序包而異,而自定義操作則不同。 –
謝謝科斯明。我現在將文件存儲在二進制表中,並在運行其他自定義操作之前使用自定義操作將其解壓縮。我正在使用WIX DTF進行自定義操作。用於存儲二進制表中字符串內容的代碼如下所示: 'string content = null; 使用(視圖v = session.Database.OpenView( 「選擇'Data' FROM'Binary' WHERE'Name' = '{0}'」, 「myResKey」)) { v.Execute(); (記錄r = v.Fetch()) { 使用(流s = r。GetStream(1)) 使用(StreamReader rs = new StreamReader(s)) { content = rs.ReadToEnd(); } } } }' –
確實如此,但InstallShield確實支持[SUPPORTFILES]的概念,並且我經常需要它們來達到合法目的,而不是您假設的反模式。 –