首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Wix/MSI和唯一的每个安装目录

Wix/MSI和唯一的每个安装目录
EN

Stack Overflow用户
提问于 2022-09-01 11:19:06
回答 1查看 46关注 0票数 1

是否可以在唯一的安装目录中安装MSI中的文件?例如,我想做以下几点:

代码语言:javascript
复制
<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),它是一个内核模式驱动程序。由于Windows文件系统的设计,一旦加载了FSD,就不能(轻松)卸载。这使得不重新启动系统就不可能卸载和升级。

作为解决办法,我已经想出了一个解决方案,在这个解决方案中,FSD安装在一个唯一的每个安装目录中,例如:\Program Files\MyProductName\SxS\<<Unique-ID>>\bin。这应该允许同时加载多个FSD实例,当前已安装的实例和先前已卸载的实例。(消防处已作出修改,以支持这类并行行动。)

例如,考虑以下情况:

MyProduceName.msi.用户安装

代码语言:javascript
复制
- The FSD is installed in `\Program Files\MyProductName\SxS\1\bin`.

FSD是加载的,并且可能是可卸载的(出于本discussion).范围以外的原因)。

MyProductName.msi.用户卸载

代码语言:javascript
复制
- The Windows installer infrastructure marks the `\Program Files\MyProductName\SxS\1\bin` as deleted but the directory remains.

  • 用户恢复相同的

代码语言:javascript
复制
- The FSD is installed in `\Program Files\MyProductName\SxS\2\bin`.

  • 消防处又被加载了。

此时,

  • 存在两个相同FSD的实例:

代码语言:javascript
复制
- The originally installed FSD, which will go away after a reboot. This FSD location is in the directory `\Program Files\MyProductName\SxS\1\bin` which is marked as deleted and will go away after a reboot.
代码语言:javascript
复制
- The currently installed FSD. This FSD location is in the directory `\Program Files\MyProductName\SxS\2\bin` and will remain after a reboot.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-01 19:28:45

您需要编写一个自定义操作,例如vbscript,它将使用一些随机数来设置字符串,然后可以设置INSTALLDIR。

代码语言:javascript
复制
dim r
randomize
r = int(rnd*10) + 1
session.TargetPath("INSTALLDIR") = session.property("ROOTDRIVE") + '\Program Files\SxS\' + r + '\bin'

此自定义操作应在CostFinalize操作之后进行排序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73568490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档