我最近完成了我的第一个Wix Intaller,但是我有一个问题,我的MSI文件只能在我的电脑上工作,我正在生成一个embedded式CAB文件。 我在安装程序中注册一个DLL。 我得到错误:“这个Windows安装程序包有问题,作为安装程序运行的程序没有按预期完成。 这就是为什么我相信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 /ic:\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 /
来源链接:
编辑:再次查看您的代码我很确定问题是:
我在前面写了一个更长的答案,我先写了:
除了Phil的答案之外: 不建议将Intel SDK安装程序安装为自定义操作 。 MSI禁止运行两个并发的InstallExecuteSequence会话,这很可能是你所看到的错误的原因。
尝试删除当前用于安装MSI的自定义操作,而是首先作为两个MSI文件的链接安装的一部分运行SDK安装程序,以查看是否可以解决问题。
COM文件不应该使用自注册注册的原因很多:
除此之外,如果您坚持使用自注册,则在编译MSI文件时不应使用任何硬编码路径 。 如果您想注册COM文件,请使用适当的COM提取方式注册COM文件,应该删除regsvr32.exe的路径,以便使用AppSearch / FileSearch条目来查找要安装到的系统上的regsvr32.exe。 该DLL应该安装到%ProgramFiles%\您的公司名称\您的项目名称\或类似的本地路径,然后注册从那里运行。 由此产生的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数据)。 如果正确执行此操作,则不需要自行注册该文件,您可以删除自定义操作。