Wix - 在循环中搜索密钥以进行安装

Wix - Search for keys in loop for installation

我的 Wix 代码如下所示:

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

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


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

<Property Id="ISCC2018EXISTX32">
    <RegistrySearch Id="IsCC2018Existx32" Root="HKLM" Key="Software\Adobe\Photoshop0.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) 有没有办法使用 <?foreach?> 在所有子注册表项上循环?

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

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

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


Looping:我不知道有任何内置的 MSI 构造可以循环注册表项。我相信您必须诉诸自定义操作才能实现此目的。

自定义操作:自定义操作可以是EXE files(本机、托管)、C++ dll( native),C# / VB dll(托管),ActiveScriptingJavaScriptVBScript),有些甚至使用 Powershell(我不会)。 你选择什么语言? 如果你能首先处理 C++ 的复杂性,C++ dll 是迄今为止最可靠的(运行时要求、可调试性等...)。经验法则:静态链接 尽可能。有时自定义操作是唯一的选择, (the case against unnecessary CAs). WiX has some C++ and managed code custom action templates in their Visual Studio Extension (do try these - install extension, and invoke via the new project dialog in Visual Studio). Maybe also .

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

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

托管 CA 调试:对于托管代码,您还显示来自自定义操作的消息框,然后附加到 rundll32.exe 运行托管代码的进程。这是来自 Advanced Installer showing you how to do this: Debug C# Custom Actions.

的精彩视频

文件复制:这不是我最喜欢的概念,但您可以尝试 MSI 的 CopyFile 功能,如下所述: WiX Installer - Run an MSI multiple times with different properties? Please be sure to check the actual WiX sources to get the overall idea of it. And here is another, similar answer: WIX: copy file to custom dir in another partition。值得一试。不是火箭科学,但我觉得它很复杂。但是 Chris 的完整示例代码应该可以帮到您。

Feature Level 0:在将功能级别设置为0时,我发现了一个意想不到的问题。此处描述:本质上:出现0级别的功能 在 administrative installation. I found this hard to believe when I saw it, and I still do, but testing indicates that it is the case. This can cause problems for your application's use in corporate environments (they depend a lot on administrative installations 期间不被提取)。解决方案?我反其道而行之:默认情况下将功能安装级别设置为 1,如果功能条件为真,则将其更改为 0。笨拙,我知道。