Wix MSI仅适用于一台计算机

时间:2016-08-23 13:25:13

标签: xml windows wix windows-installer installer

我最近完成了我的第一个Wix Intaller,但是我遇到了问题,我的MSI文件仅适用于我的计算机,我正在生成一个嵌入式CAB文件。我正在安装程序中注册DLL。我收到错误:“此Windows Installer程序包存在问题。作为安装程序的一部分运行的程序没有按预期完成。”这就是为什么我认为DLL是问题的一部分。我在下面有一些代码片段,如果你需要看到更多让我知道,谢谢!

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>

3 个答案:

答案 0 :(得分:4)

这种注册失败通常是因为Dll不会加载,因为它缺少依赖关系(假设其他一切都是正确的)。其他问题可能包括运行regsvr32的错误位(例如64位版本)并尝试注册32位Dll。

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

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

答案 1 :(得分:1)

首先,为您的设置创建详细的日志文件,以便您可以找到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的计算机。
  3. 我要离开之前我写过的更长的答案:

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

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

    不应使用自行注册注册COM文件,原因有很多:

    除此之外,如果您坚持使用自行注册,在编译MSI文件时不应使用任何硬编码路径。忽略您应该使用正确的COM提取注册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"'>
    

    也许也读过这些文章:

答案 2 :(得分:0)

使用代码示例添加更短的答案,暂时留在我的其他答案中:

  • 您需要将 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的先决条件运行。