根据我们产品安装的要求,我们需要在用户计算机的C:\ Windows \ System32中安装一些dll。由于Windows安装程序会自动安装较高版本,如果源代码的版本高于目标,并且这样做会在用户不知情的情况下修改用户的系统,我希望在C:\ Windows \中已经存在dll时,组件块根本不会触发System32中。这就是为什么我正在做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'是你如何检查它?任何帮助都感激不尽。坚持这个问题好几天了!
答案 0 :(得分:0)
您作为条件使用的语法是preprocessor,它在构建时解析,而不是运行时。您需要使用在文件搜索后评估的适当conditional来制作expression。
答案 1 :(得分:0)
除了组件条件情况之外,没有必要这样做。分发VC ++可再发行组件的标准方法是将redist包作为先决条件运行。当你说“我的安装程序文件,它是更高版本,已经替换了目标文件”时,你根本就不应该这样做。您可能会破坏客户端系统。
我还注意到,使用Windows Installer组件ID共享这样的共享Dll,因此使用vcomp140.dll之类的每个产品都会使用相同的组件ID安装它。同样,您只需使用自己的组件ID安装它就有可能破坏该Dll的共享。
正确的操作是将redist作为先决条件运行,它将做正确的事情。