簡體   English   中英

Wix/MSI 和唯一的每個安裝目錄

[英]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中。

我已經將DATETIME變量視為生成<<Unique-ID>>的一種方法,但不幸的是,它們包含在文件名中不合法的字符(並且它們的格式因語言環境而異)。 任何有關如何解決此問題的建議表示贊賞。 如果唯一的答案是使用自定義操作,您會建議我在InstallExecuteSequence中的哪個位置放置自定義操作?

解釋

下面是我為什么需要這個的解釋。

我有一個 Windows 文件系統驅動程序 (FSD),它是一個 kernel 模式驅動程序。 由於 Windows 文件系統設計,一旦加載 FSD,就無法(輕松)卸載它。 這使得在不重新啟動系統的情況下無法進行卸載和升級。

作為一種解決方法,我提出了一個解決方案,將 FSD 安裝在每個安裝的唯一目錄中,例如: \Program Files\MyProductName\SxS\<<Unique-ID>>\bin 這應該允許同時加載 FSD 的多個實例,當前安裝的實例和任何以前卸載的實例。 (FSD 已經被修改為支持這種並行操作。)

例如,考慮以下場景:

  • 用戶安裝MyProduceName.msi

    • FSD 安裝在\Program Files\MyProductName\SxS\1\bin中。
  • FSD 已加載並且可能無法加載(出於本討論的 scope 之外的原因)。

  • 用戶卸載MyProductName.msi

    • Windows 安裝程序基礎結構將\Program Files\MyProductName\SxS\1\bin標記為已刪除,但目錄仍然存在。
  • 用戶重新安裝相同的MyProductName.msi

    • FSD 安裝在\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.

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