【问题标题】:Wix MSI Only Works on One ComputerWix MSI 仅适用于一台计算机
【发布时间】:2016-12-30 08:40:24
【问题描述】:

我最近完成了我的第一个 Wix Intaller,但是我遇到了一个问题,我的 MSI 文件只能在我的计算机上运行,​​我正在生成一个嵌入式 CAB 文件。我正在安装程序中注册一个 DLL。我收到错误消息:“此 Windows 安装程序包存在问题。作为安装程序的一部分运行的程序未按预期完成。”这就是为什么我认为 DLL 是问题的一部分。我在下面有一些代码 sn-ps,如果您需要查看更多信息,请告诉我,谢谢!

DLL 安装的自定义操作:

<Product Id="*" UpgradeCode="12345678-1234-1234-1234-111111111111"
          Name="FP7000 Camera App" Version="1.0" Manufacturer="Stryker Corp" Language="1033">
    <Package InstallerVersion="200" Compressed="yes" Comments="Windows Installer Package"/>
    <Media Id="1" Cabinet="product.cab" EmbedCab="no"/>

<!--Installing/Uninstalling Supporting Programs and DLLs-->
 <CustomAction Id="RegisterFP7000"
              Directory="dirCF50D58BC65CC93005501980AACC3EDD"
              ExeCommand='C:\Windows\system32\regsvr32.exe /s "C:\Projects\Stryker\Install Files\DLLs\FP7000-Camera.dll"'>
</CustomAction>

<CustomAction Id="UnregisterFP7000"
              Directory="dirCF50D58BC65CC93005501980AACC3EDD"
              ExeCommand='C:\Windows\system32\regsvr32.exe /s /u "C:\Projects\Stryker\Install Files\DLLs\FP7000-Camera.dll"'>
</CustomAction> 

<CustomAction Id="InstallSDK"
             Directory="dirCF50D58BC65CC93005501980AACC3EDD"
             ExeCommand='C:\Windows\system32\msiexec /i "C:\Projects\Stryker\Install Files\Included Apps\Intel_Media_SDK_2016_R2.msi" /quiet'
             Execute='deferred'
             Impersonate='no'
             Return='asyncNoWait'>
</CustomAction>

<CustomAction Id="UninstallSDK"
              Directory="dirCF50D58BC65CC93005501980AACC3EDD"
              ExeCommand='MsiExec.exe /X{C39967EA-A3DB-4B49-9BCA-74E4D0007533}'
              Execute='deferred'
              Impersonate='no'
              Return='asyncNoWait'>
</CustomAction> 

安装顺序:

<InstallExecuteSequence>
      <Custom Action="RegisterFP7000" After="InstallFinalize">NOT Installed</Custom>
      <Custom Action="UnregisterFP7000" Before="InstallFinalize">REMOVE="ALL"</Custom> 
      <Custom Action="InstallSDK" After="InstallFiles">NOT Installed</Custom>
      <Custom Action="UninstallSDK" Before="InstallFinalize">REMOVE="ALL"</Custom>
</InstallExecuteSequence>

【问题讨论】:

  • 一般来说,您可以通过在详细的 MSI 日志中查找与错误相关的部分来询问有关 Windows Installer 错误的更好问题。然后您就可以确定失败的原因,并可以提出更尖锐的问题。
  • 记住这一点!

标签: xml windows wix windows-installer installation


【解决方案1】:

此类注册失败通常是因为 Dll 无法加载,因为它缺少依赖项(假设其他所有内容都正确)。其他问题可能包括运行错误的 regsvr32 位数(例如 64 位版本)和尝试注册 32 位 Dll。

无论如何,没有必要这样做。执行此操作的最佳实践和推荐方法是使用 Heat.exe 将注册数据收集到 wxs 文件中,这样安装就会在您进行安装时创建正确的注册表项。

How do you register a Win32 COM DLL file in WiX 3?

【讨论】:

    【解决方案2】:

    首先,为您的设置创建一个详细的日志文件,以便您可以找到 msiexec 记录的错误消息:

    msiexec.exe /i c:\setup.msi /QN /L*V "C:\Temp\msilog.log"
    

    快速解释:

     /L*V "C:\Temp\msilog.log"= verbose logging
     /QN = run completely silently
     /i = run install sequence 
    

    打开日志文件并搜索“value 3”,如下所述:http://robmensching.com/blog/posts/2010/8/2/the-first-thing-i-do-with-an-msi-log/

    来源链接:


    编辑:再次查看您的代码,我很确定问题是:

    1. 您通过自定义操作安装嵌入式运行时设置。这不应通过自定义操作运行,而是作为先决条件设置在您自己的 MSI 文件之前运行。
    2. 您为 dll 指定硬编码路径,而不是将 dll 安装到主安装目录并在那里注册。这意味着该设置只能在您的系统上运行,因为这是唯一在该特定位置具有可用 dll 的计算机。

    我要离开之前写的更长的答案:


    除了 Phil 的回答:不建议将英特尔 SDK 设置作为自定义操作安装。 MSI 禁止运行两个并发的 InstallExecuteSequence 会话,这很可能是您看到的错误的原因。

    尝试删除当前用于安装 MSI 的自定义操作,而是首先运行 SDK 设置作为两个 MSI 文件的链式安装的一部分,看看这是否能解决问题。

    出于多种原因,不应使用自注册来注册 COM 文件:

    除此之外,如果您坚持使用自行注册,在编译 MSI 文件时不应使用任何硬编码路径。忽略您应该注册 COM 文件这一事实,正如 Phil 指出的那样,使用正确的 COM 提取,应该删除 regsvr32.exe 的路径,以支持 AppSearch / FileSearch 条目,该条目将在您正在安装的系统上找到 regsvr32.exe到。 DLL 应安装到 %ProgramFiles%\Your Company Name\Your Project Name\ 或类似路径下的本地路径,然后注册以从那里运行。生成的 WIX 代码类似于:

    ExeCommand='[PATHTOREGSVR32]regsvr32.exe /s "[INSTALLDIR]FP7000-Camera.dll"'>
    

    也许也读过这些文章:

    【讨论】:

      【解决方案3】:

      用代码示例添加一个更简短的答案,暂时留在我的另一个答案中:

      • 您需要将 FP7000-Camera.dll 文件安装到 Program Files 下的目录并在那里注册。下面是 CodeProject 上的一个示例的快速模型:http://www.codeproject.com/Tips/105638/A-quick-introduction-Create-an-MSI-installer-with

          <?xml version="1.0"?>
          <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
             <Product Id="*" UpgradeCode="put-guid-here" 
                     Name="Example Product Name" Version="0.0.1"
                     Manufacturer="Example Company Name" Language="1033">
            <Package InstallerVersion="200" Compressed="yes" 
                     Comments="Windows Installer Package"/>
        
          <Media Id="1" Cabinet="product.cab" EmbedCab="yes"/>
          <Directory Id="TARGETDIR" Name="SourceDir">
             <Directory Id="ProgramFilesFolder">
                <Directory Id="INSTALLDIR" Name="Example">
                   <Component Id="FP7000-Camera.dll" Guid="*">
                      <File Id="FP7000-Camera.dll" Source="replace with path to FP7000-Camera.dll"/>
                   </Component>
                </Directory>
             </Directory>
          </Directory>
        
            <Feature Id="DefaultFeature" Level="1">
              <ComponentRef Id="FP7000-Camera.dll"/>
            </Feature>
        
           </Product>
          </Wix>
        
      • 您还应该删除 dll 的自注册,而是将 COM 注册添加到将文件安装到磁盘的组件中。在此处查看示例:How do you register a Win32 COM DLL file in WiX 3?(运行 Wix 工具 heat.exe 以生成要包含在组件中的 COM 数据)。如果您正确执行此操作,则无需自行注册文件,您可以删除自定义操作来执行此操作。

      • 最后,您应该SDK 运行时 MSI 作为自定义操作安装,而是首先将其作为 MSI 的先决条件运行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-08-25
        • 1970-01-01
        • 1970-01-01
        • 2011-03-27
        • 2022-09-28
        • 2011-06-10
        • 1970-01-01
        相关资源
        最近更新 更多