繁体   English   中英

Wix MSI仅在一台计算机上工作

[英]Wix MSI Only Works on One Computer

我最近完成了我的第一个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>

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

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

如何在WiX 3中注册Win32 COM DLL文件?

首先,为您的设置创建一个详细的日志文件 ,以便您可以找到由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的回答外, 不建议将Intel SDK设置作为自定义操作进行安装 MSI禁止运行两个并发的InstallExecuteSequence会话,这很可能是您所看到的错误的原因。

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

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

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

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

也许也阅读这些文章:

在代码示例中添加一个简短的答案,现在暂时保留我的其他答案:

  • 您需要将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注册添加到将文件安装到磁盘的组件中。 在此处查看示例: 如何在WiX 3中注册Win32 COM DLL文件? (运行Wix工具heat.exe生成要包含在组件中的COM数据)。 如果正确执行此操作,则无需自行注册文件,您可以删除自定义操作。

  • 最后,你应该安装SDK运行MSI作为一个自定义操作,但首先运行它作为一个先决条件的MSI。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM