【问题标题】:How to show a warning and exit if a software is not installed on WIX installer如果 WIX 安装程序上未安装软件,如何显示警告并退出
【发布时间】:2016-02-24 17:46:38
【问题描述】:

我是 Wix 的新手,让我提供一些关于我想要完成的任务的信息。我有软件“B”的安装程序,但该软件需要软件“A”才能实际工作。所以我想添加软件“B”的安装程序以检查是否安装了软件“A”,如果没有,则显示一条消息然后退出安装程序。

所以下面是我尝试过的代码,但即使文件在那里,消息也会始终显示。所以我基本上是从软件“A”中寻找一个文件,如果它存在,那么安装应该正常继续,如果不是,那么应该显示警告消息并退出安装程序。

 <Property Id="SOFTWARE_A_INSTALLED">
  <DirectorySearch
    Id="LocationFile"
    Path="C:\Windows\Microsoft.NET\assembly\SOFTWAREA">
    <FileSearch Name="A.dll"></FileSearch>
  </DirectorySearch>
</Property>

<Condition Message="[ProductName] requires SOFTWARE A installed.">
  <![CDATA[Installed OR SOFTWARE_A_INSTALLED]]>
</Condition>

谢谢

【问题讨论】:

  • 取消条件表达式的注释?一些相关提示:使用支持着色和内容辅助的 XML 编辑器和 XML 模式支持 (.xsd),例如视觉工作室。 Stack Overflow 上的着色也指出了评论。

标签: wix windows-installer installation


【解决方案1】:

通常有更好的方法来做到这一点。如果该产品是 MSI 文件,则使用 Upgrade 元素检测产品的 UpgradeCode,或使用该组件的组件 ID 进行组件搜索。或者,该产品可能会创建一个您可以搜索的注册表项。

总的来说,我不推荐您的方法,因为您说您的产品 B 需要 A 才能工作。您没有说您的 INSTALL 需要 A 才能成功安装,因此当实际上只有一个产品依赖项时,您正在创建安装顺序依赖项。那么如果 A 被卸载,你的产品会做什么呢?碰撞?给任何形式的警告?更好的解决方案可能是让您的应用程序进行检查,而不是创建所需的安装顺序。

如果来自 A 的程序集确实是您的应用程序的依赖项,并且它只是您所依赖的少数文件之一,那么也许它应该是可再分发的,可以作为合并模块之类的东西使用。人们(例如)不会检查 Crystal Reports 文件是否在系统上 - 他们只是包含包含文件的合并模块,并以系统的多个用户都可以共享相同文件的方式安装它们。许多其他共享文件也是如此。

此 vbscript 将枚举已安装的组件 ID,以检查您是否具有正确的组件搜索值:

Option Explicit
Public installer, fullmsg, comp, a, prod, fso, pname, ploc, pid, psorce

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set a = fso.CreateTextFile("comps.txt", True)

    ' Connect to Windows Installer object
    Set installer = CreateObject("WindowsInstaller.Installer")
    a.writeline ("MSI Components")
    on error resume next
    For Each comp In installer.components
       a.writeline (comp & " is used by the product:")
       for each prod in Installer.ComponentClients (comp) 
          pid = installer.componentpath (prod, comp) 
          pname = installer.productinfo (prod, "InstalledProductName")
          a.Writeline ("     " & pname & " " & prod & "and is installed at " & pid)
       Next
    Next

【讨论】:

  • 所以我尝试使用组件搜索作为您的建议之一...即使软件 A 已安装,我仍然收到显示消息。我错过了什么?
  • 看起来不错,请检查您的组件 ID 是否正确,请参阅我添加的脚本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
相关资源
最近更新 更多