[英]Wix/MSI and unique per-installation directory
是否可以將 MSI 中的文件安裝在唯一的每個安裝目錄中? 例如,我想做與以下等效的操作:
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLDIR" Name="$(var.MyProductName)">
<Directory Id="SXSBASEDIR" Name="SxS">
<Directory Id="SXSDIR" Name="<<Unique-ID>>">
^
|
---------- Notice the <<Unique-ID>> here ----------+
<Directory Id="BINDIR" Name="bin" />
</Directory>
</Directory>
</Directory>
</Directory>
</Directory>
<<Unique-ID>>
對於每個安裝都必須不同。 例如,如果安裝 MSI 一次,文件最終安裝在\Program Files\MyProductName\SxS\<<Unique-ID-1>>\bin
中。 如果隨后卸載並重新安裝相同的 MSI,文件最終應安裝在\Program Files\MyProductName\SxS\<<Unique-ID-2>>\bin
中。
我已經將DATE
和TIME
變量視為生成<<Unique-ID>>
的一種方法,但不幸的是,它們包含在文件名中不合法的字符(並且它們的格式因語言環境而異)。 任何有關如何解決此問題的建議表示贊賞。 如果唯一的答案是使用自定義操作,您會建議我在InstallExecuteSequence
中的哪個位置放置自定義操作?
下面是我為什么需要這個的解釋。
我有一個 Windows 文件系統驅動程序 (FSD),它是一個 kernel 模式驅動程序。 由於 Windows 文件系統設計,一旦加載 FSD,就無法(輕松)卸載它。 這使得在不重新啟動系統的情況下無法進行卸載和升級。
作為一種解決方法,我提出了一個解決方案,將 FSD 安裝在每個安裝的唯一目錄中,例如: \Program Files\MyProductName\SxS\<<Unique-ID>>\bin
。 這應該允許同時加載 FSD 的多個實例,當前安裝的實例和任何以前卸載的實例。 (FSD 已經被修改為支持這種並行操作。)
例如,考慮以下場景:
用戶安裝MyProduceName.msi
。
\Program Files\MyProductName\SxS\1\bin
中。FSD 已加載並且可能無法加載(出於本討論的 scope 之外的原因)。
用戶卸載MyProductName.msi
。
\Program Files\MyProductName\SxS\1\bin
標記為已刪除,但目錄仍然存在。 用戶重新安裝相同的MyProductName.msi
。
\Program Files\MyProductName\SxS\2\bin
中。FSD 再次加載。
此時存在相同 FSD 的兩個實例:
原來安裝的FSD,重啟后會go消失。 此 FSD 位置位於目錄\Program Files\MyProductName\SxS\1\bin
中,該目錄被標記為已刪除,並且在重新啟動后將 go 消失。
當前安裝的 FSD。 此 FSD 位置位於目錄\Program Files\MyProductName\SxS\2\bin
中,並且在重新啟動后將保留。
您需要編寫一個自定義操作,例如 vbscript 它將使用一些隨機數設置字符串,然后可以設置 INSTALLDIR。
dim r
randomize
r = int(rnd*10) + 1
session.TargetPath("INSTALLDIR") = session.property("ROOTDRIVE") + '\Program Files\SxS\' + r + '\bin'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.