installation - 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 语言无法做到这一点,有没有办法使用自定义操作来做到这一点?(如果有人能指出我如何做这样的事情,我从来没有做过任何自定义动作,我会很感激)。
解决方案
总体:很难为“未来”创建设置。事情有一种完全改变的方式,所以你支持目前未知的东西的好计划被浪费了(他们开始使用完全不同的键,或者UWP
使用整个应用程序)。您最好放弃此愿望清单支持,并在时机成熟时编译新设置。我的两分钱。
循环:我不知道有任何内置的 MSI 结构来循环注册表项。我相信你必须诉诸自定义操作来实现这一点。
自定义操作:自定义操作可以是EXE files
(本地、托管)、C++ dll
(本地)、C# / VB dll
(托管)、ActiveScripting
(JavaScript
、VBScript
),有些甚至可以使用Powershell
(我不会)。您选择的语言是什么?如果您可以首先处理 C++ 复杂性,C++ dll 是迄今为止最可靠的(运行时要求、可调试性等)。经验法则:尽可能静态链接。有时自定义操作是唯一的选择,但要小心(针对不必要的 CA 的情况)。WiX 在其Visual Studio 扩展中有一些 C++ 和托管代码自定义操作模板(请尝试这些- 安装扩展,并通过 Visual Studio 中的新项目对话框调用)。也许也快点检查一下。
有一段时间没有阅读这些内容,但想确保您拥有它们:
- 如何在 C++ 中创建自定义操作 DLL
- 如何在托管语言(如 C#)中创建自定义操作?(
Chris Painter: can you skim-check perhaps? Outdated article? You know I am no good with managed code
) - github上的C ++ CA示例(未经我测试,看起来很简单)
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。克朗克,我知道。
推荐阅读
- c# - 如果在关闭时使用,是否保证方法的其余部分将在 WhenAll 之后执行?
- http-authentication - 如何使用 CLI 参数为 Traefik 仪表板设置密码?
- excel - 在以某种方式对其进行操作后,如何计算字符串值满足特定条件的范围内的单元格?
- arduino - Arduino MKRFOX1200 COM 端口不工作
- objective-c - 如何获取我的块的返回值
- sql-server - 通过 SQL Server 代理运行的 SSIS 包无法修改变量
- amazon-web-services - 将 SNS 主题订阅从一个设备端点复制到另一个
- php - 在邮件 PHP 中添加 QR 图像
- sql-server - how to optimize nested loop query
- c# - 命名空间 xamarin 中不存在资源