【发布时间】:2018-02-14 20:55:45
【问题描述】:
根据我们产品安装的要求,我们需要在用户计算机的 C:\Windows\System32 中安装一些 dll。由于如果源的版本高于目标的版本,Windows Installer 会自动安装更高的版本,并且这样做会在用户不知情的情况下修改用户的系统,所以当 dll 已经存在于 C:\Windows\ 中时,我希望组件块根本不触发系统 32。这就是为什么我要进行 FileSearch 并将属性设置为一个值以防文件存在的原因。根据文档,它将是指定文件的路径。
<Property Id="VCOMP_EXISTS_LOCAL">
<DirectorySearch Id="vcomp_parent_dir" Path="$(var.SystemPlatformFolder)">
<FileSearch Id="vcomp_file" Name="vcomp140.dll"/>
</DirectorySearch>
</Property>
稍后我将使用 VCOMP_EXISTS_LOCAL 属性,如以下块中所示有条件地安装组件。
<ComponentGroup Id="AdditionalDependencies" Directory="$(var.SystemPlatformFolder)">
<?if $(var.vcomp140_exists) = "true"?>
<Component>
<Condition>NOT VCOMP_EXISTS_LOCAL</Condition>
<File Source="$(var.AdditionalDependenciesRoot)/OpenMP/vcomp140.dll"/>
</Component>
<?endif?>
</ComponentGroup>
问题是,当我针对目标文件存在的情况进行测试时,我看到我的安装程序文件(更高版本)已替换目标文件,而根据上述逻辑,它不应该摸过它。此外,我没有看到详细日志中回显的属性值。我在日志中看到的就是这个
AppSearch:属性:VCOMP_EXISTS_LOCAL,签名:vcomp_file
而不是通常情况下的以下内容。
属性(S):VCOMP_EXISTS_LOCAL = C:\Windows\System32
外部条件预处理器指令用于检查另一个条件,其中 var.vcomp140_exists 在编译期间传递给candle.exe(使用 -d 开关)。所以这是一个构建/编译时间条件。我知道外部条件有效(传递的值为真)。 WI 似乎忽略了内部安装时间条件块。可以这样混吗?
如果可以,我想我的问题是不知道如何检查是否设置了属性值。我在 Wix 文档的某处发现,如果搜索失败,属性将保持未定义或保持其原始值。在这种情况下,我想它将是未定义的。问题是如果'NOT PROPERTYNAME'是你如何检查它?任何帮助都感激不尽。纠结这个问题好几天!
【问题讨论】:
标签: visual-c++ wix windows-installer