首页 > 解决方案 > Wix - 在循环中搜索密钥以进行安装

问题描述

我的 wix 代码如下所示:

<!-- CC 2017 = Version 110.0 -->
<Property Id="ISCC2017EXISTX64">
    <RegistrySearch Id="IsCC2017Existx64" Root="HKLM" Key="Software\Adobe\Photoshop\110.0" Name="ApplicationPath" Win64="yes" Type="raw" />
</Property>

<Property Id="ISCC2017EXISTX32">
    <RegistrySearch Id="IsCC2017Existx32" Root="HKLM" Key="Software\Adobe\Photoshop\110.0" Name="ApplicationPath" Win64="no" Type="raw" />
</Property>


<!-- CC 2018 = Version 120.0 -->
<Property Id="ISCC2018EXISTX64">
    <RegistrySearch Id="IsCC2018Existx64" Root="HKLM" Key="Software\Adobe\Photoshop\120.0" Name="ApplicationPath" Win64="yes" Type="raw" />
</Property>

<Property Id="ISCC2018EXISTX32">
    <RegistrySearch Id="IsCC2018Existx32" Root="HKLM" Key="Software\Adobe\Photoshop\120.0" Name="ApplicationPath" Win64="no" Type="raw" />
</Property>

我在哪里搜索以了解计算机上是否安装了 Photoshop CC 2017 或 CC 2018。如果是这样,我可以安装以下功能:

    <Feature Id="FEATURE_EXTENSION_CC2017" Title="CC 2017" Description="Install KEY36 for CC 2017" Level="0">
        <Condition Level="1">ISCC2017EXISTX64</Condition>
        <ComponentGroupRef Id="CG_CC2017" />
    </Feature>

    <Feature Id="FEATURE_EXTENSION_CC2018" Title="CC 2018" Description="Install KEY36 for CC 2018" Level="0">
        <Condition Level="1">ISCC2018EXISTX64</Condition>
        <ComponentGroupRef Id="CG_CC2018" />
    </Feature>

所以明年Photoshop会发布Photoshop CC 2019,我不想专门为这个版本创建安装程序。我想搜索 Registry :Software\Adobe\Photoshop并遍历每个可能的版本(如上述情况下的 110.0 和 120.0 )。

所以我的问题是:

1) 有没有办法使用 a 循环所有子注册表项<?foreach?>

2)有没有办法让一个 ComponentGroupRef 指向同一个文件,但我希望它们被复制到不同的目录中?因为现在我为每个版本定义了两次相同的组件。

如果使用 Wix 语言无法做到这一点,有没有办法使用自定义操作来做到这一点?(如果有人能指出我如何做这样的事情,我从来没有做过任何自定义动作,我会很感激)。

标签: installationwixwindows-installerregistry

解决方案


总体:很难为“未来”创建设置。事情有一种完全改变的方式,所以你支持目前未知的东西的好计划被浪费了(他们开始使用完全不同的键,或者UWP使用整个应用程序)。您最好放弃此愿望清单支持,并在时机成熟时编译新设置。我的两分钱。


循环:我不知道有任何内置的 MSI 结构来循环注册表项。我相信你必须诉诸自定义操作来实现这一点。

自定义操作:自定义操作可以是EXE files(本地、托管)、C++ dll(本地)、C# / VB dll(托管)、ActiveScriptingJavaScriptVBScript),有些甚至可以使用Powershell(我不会)。您选择的语言是什么?如果您可以首先处理 C++ 复杂性,C++ dll 是迄今为止最可靠的(运行时要求、可调试性等)。经验法则:尽可能静态链接。有时自定义操作是唯一的选择,但要小心(针对不必要的 CA 的情况)。WiX 在其Visual Studio 扩展中有一些 C++ 和托管代码自定义操作模板(请尝试这些- 安装扩展,并通过 Visual Studio 中的新项目对话框调用)。也许也快点检查一下

有一段时间没有阅读这些内容,但想确保您拥有它们:

C++ CA 调试:使用 C++,您可以在要调试的自定义操作函数中显示一个消息框,然后将调试器附加到弹出的消息框。本质上只是附加到msiexec.exe- 用户上下文一或系统上下文一,具体取决于您的自定义操作的排序方式。即时、完整的可调试性。

托管 CA 调试:对于托管代码,您还可以显示自定义操作的消息框,然后附加到rundll32.exe运行托管代码的进程。这是来自Advanced Installer的精彩视频,向您展示了如何执行此操作:调试 C# 自定义操作

文件复制:不是我最喜欢的概念,但您可以尝试CopyFile此处描述的 MSI 功能: WiX Installer - Run an MSI multiple times with different properties? 请务必检查实际的 WiX 资源以了解它的整体概念。这是另一个类似的答案: WIX: copy file to custom dir in another partition。值得一试。不是火箭科学,但我觉得它很繁琐。但是 Chris 的完整示例代码应该可以帮助您。

功能级别 0:在将功能级别设置为0. 它在这里描述:失败条件 wix本质上:设置为 level 的功能0似乎在管理安装期间没有被提取。当我看到它时,我发现这很难相信,现在我仍然相信,但测试表明确实如此。这可能会导致您的应用程序在企业环境中的使用出现问题(它们在很大程度上依赖于管理安装)。解决方案?我反其道而行之:默认将功能安装级别设置为 1,如果功能条件为真,则将其更改为 0。克朗克,我知道。


推荐阅读