如果 WIX 安装程序未安装软件,如何显示警告并退出

How to show a warning and exit if a software is not installed on WIX installer

我是 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>

谢谢

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

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

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

此 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