我有一个非常简单的安装程序 – 将一个DLL复制到Program Files子文件夹并使用regsvr32.exe注册它.效果很好,但是如果安装了旧版本的dll,“修复”不会覆盖现有的dll. dll已签名,其版本(版本)编号始终递增(例如2.0.0.123 – > 2.0.0.124).
查看以前的类似帖子,我添加了RemoveExistingProducts并将ProductId指定为“*”.卸载然后安装新版本工作正常,但我真的需要修复来更新现有的DLL.
还有什么我需要做的吗?
谢谢!
<?xml version="1.0" encoding="UTF-8"?> <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"> <!-- When creating a new install for the next version,these fields must be modified --> <?define ProductVersion = "2.0.00" ?> <?define ProductId64 = "*" ?> <?define ProductId32 = "*" ?> <?define PackageId = "45F34788-66AC-441C-B666-707FFA7F1EE9" ?> <!-- Product name as you want it to appear in Add/Remove Programs--> <?if $(var.Platform) = x64 ?> <?define ProductName = "XYZ (64 bit)" ?> <?define Win64 = "yes" ?> <?define PlatformProgramFilesFolder = "ProgramFiles64Folder" ?> <?define ProductId = "$(var.ProductId64)" ?> <?define MainDllName = "XYZ64.dll" ?> <?define MainDllSource = "..\..\bin\Win64\Release\XYZ64.dll" ?> <?else ?> <?define ProductName = "XYZ (32 bit)" ?> <?define Win64 = "no" ?> <?define PlatformProgramFilesFolder = "ProgramFilesFolder" ?> <?define ProductId = "$(var.ProductId32)" ?> <?define MainDllName = "XYZ.dll" ?> <?define MainDllSource = "..\..\bin\Win32\Release\XYZ.dll" ?> <?endif ?> <?define UpgradeCode = "{C3763742-7C1C-4AB7-A404-F030B7550E97}" ?> <Product Id="$(var.ProductId)" Name="$(var.ProductName)" Language="1033" Version="$(var.ProductVersion)" Manufacturer="Advanced Messaging Systems LLC" UpgradeCode="$(var.UpgradeCode)"> <Package Id="$(var.PackageId)" InstallerVersion="200" Compressed="yes" Description="XYZ Installer package" InstallPrivileges="elevated"/> <!-- No restore point --> <Property Id="MSIFASTINSTALL" Value="3" /> <Media Id="1" Cabinet="media1.cab" EmbedCab="yes" /> <Directory Id="TARGETDIR" Name="SourceDir"> <Directory Id="$(var.PlatformProgramFilesFolder)"> <Directory Id="INSTALLLOCATION" Name="XYZ"> <Component Id="XYZDll" Guid="E2CBEE41-6C0E-4A84-95C1-7282747B4A3D"> <File Id='MainDll' Name="$(var.MainDllName)" DiskId='1' Source="$(var.MainDllSource)" SelfRegCost="0" /> <!-- TODO: Insert files,registry keys,and other resources here. --> </Component> </Directory> </Directory> </Directory> <Property Id="WIXUI_INSTALLDIR" Value="INSTALLLOCATION" /> <!-- Note: Custom actions to install/uninstall the dll using regsvr32.exe --> <CustomAction Id="RegisterDll" Directory="INSTALLLOCATION" ExeCommand='regsvr32.exe /s "[INSTALLLOCATION]$(var.MainDllName)"' Return="check"> </CustomAction> <CustomAction Id="UnregisterDll" Directory="INSTALLLOCATION" ExeCommand='regsvr32.exe /s /u "[INSTALLLOCATION]$(var.MainDllName)"'> </CustomAction> <Feature Id="ProductFeature" Title="XYZ" Level="1"> <ComponentRef Id="XYZDll" /> <!-- Note: The following ComponentGroupRef is required to pull in generated authoring from project references. --> <ComponentGroupRef Id="Product.Generated" /> </Feature> <InstallUISequence> <Custom Action="WixCloseApplications" Before="AppSearch"/> </InstallUISequence> <InstallExecuteSequence> <!-- Uninstall prevIoUs version before installing this one. --> <RemoveExistingProducts Before="InstallInitialize"/> <SelfRegModules/> </InstallExecuteSequence> <Icon Id="XYZ.ico" SourceFile="..\Graphics\XYZ.ico"/> <Property Id="ARPPRODUCTICON" Value="XYZ.ico" /> <!-- UI --> <UIRef Id="WixUI_InstallDir"/> <UIRef Id="WixUI_ErrorProgressText" /> <WixVariable Id="WixUILicenseRtf" Value="..\EULA\license.rtf" /> <WixVariable Id="WixUIBannerBmp" Value="..\Graphics\banner.jpg" /> <WixVariable Id="WixUIDialogBmp" Value="..\Graphics\logo.jpg" /> <!-- End UI --> </Product> </Wix>
<?xml version="1.0" encoding="UTF-8"?> <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"> <!-- When creating a new install for the next version,these fields must be modified --> <?define ProductVersion = "2.0.4" ?> <?define ProductId64 = "*" ?> <?define ProductId32 = "*" ?> <?define PackageId = "*" ?> <!-- Product name as you want it to appear in Add/Remove Programs--> <?if $(var.Platform) = x64 ?> <?define ProductName = "XYZ (64 bit)" ?> <?define Win64 = "yes" ?> <?define PlatformProgramFilesFolder = "ProgramFiles64Folder" ?> <?define ProductId = "$(var.ProductId64)" ?> <?define MainDllName = "XYZ64.dll" ?> <?define MainDllSource = "..\..\bin\Win64\Release\XYZ64.dll" ?> <?else ?> <?define ProductName = "XYZ (32 bit)" ?> <?define Win64 = "no" ?> <?define PlatformProgramFilesFolder = "ProgramFilesFolder" ?> <?define ProductId = "$(var.ProductId32)" ?> <?define MainDllName = "XYZ.dll" ?> <?define MainDllSource = "..\..\bin\Win32\Release\XYZ.dll" ?> <?endif ?> <?define UpgradeCode = "{C3763742-7C1C-4AB7-A404-F030B7550E97}" ?> <Product Id="$(var.ProductId)" Name="$(var.ProductName)" Language="1033" Version="$(var.ProductVersion)" Manufacturer="Advanced Messaging Systems LLC" UpgradeCode="$(var.UpgradeCode)" > <Package Id="$(var.PackageId)" InstallerVersion="200" Compressed="yes" Description="XYZ Installer package" InstallPrivileges="elevated" /> <!-- No restore point --> <Property Id="MSIFASTINSTALL" Value="3" /> <Upgrade Id="$(var.UpgradeCode)"> <UpgradeVersion Minimum="1.0.0" IncludeMinimum="yes" OnlyDetect="no" Maximum="$(var.ProductVersion)" IncludeMaximum="no" Property="PREVIoUSFOUND" /> </Upgrade> <Media Id="1" Cabinet="media1.cab" EmbedCab="yes" /> <Directory Id="TARGETDIR" Name="SourceDir"> <Directory Id="$(var.PlatformProgramFilesFolder)"> <Directory Id="INSTALLLOCATION" Name="XYZ"> <Component Id="XYZDll" Guid="E2CBEE41-6C0E-4A84-95C1-7282747B4A3D"> <File Id='MainDll' Name="$(var.MainDllName)" DiskId='1' Source="$(var.MainDllSource)" SelfRegCost="0" /> <!-- TODO: Insert files,and other resources here. --> </Component> </Directory> </Directory> </Directory> <Property Id="WIXUI_INSTALLDIR" Value="INSTALLLOCATION" /> <!-- Note: Custom actions to install/uninstall the dll using regsvr32.exe --> <CustomAction Id="RegisterDll" Directory="INSTALLLOCATION" ExeCommand='regsvr32.exe /s "[INSTALLLOCATION]$(var.MainDllName)"' Return="check"> </CustomAction> <CustomAction Id="UnregisterDll" Directory="INSTALLLOCATION" ExeCommand='regsvr32.exe /s /u "[INSTALLLOCATION]$(var.MainDllName)"'> </CustomAction> <Feature Id="ProductFeature" Title="XYZ" Level="1"> <ComponentRef Id="XYZDll" /> <!-- Note: The following ComponentGroupRef is required to pull in generated authoring from project references. --> <ComponentGroupRef Id="Product.Generated" /> </Feature> <InstallUISequence> <Custom Action="WixCloseApplications" Before="AppSearch"/> </InstallUISequence> <InstallExecuteSequence> <RemoveExistingProducts After="InstallInitialize"/> <SelfRegModules/> </InstallExecuteSequence> <Icon Id="XYZ.ico" SourceFile="..\Graphics\XYZ.ico"/> <Property Id="ARPPRODUCTICON" Value="XYZ.ico" /> <!-- UI --> <UIRef Id="WixUI_InstallDir"/> <UIRef Id="WixUI_ErrorProgressText" /> <WixVariable Id="WixUILicenseRtf" Value="..\EULA\license.rtf" /> <WixVariable Id="WixUIBannerBmp" Value="..\Graphics\banner.jpg" /> <WixVariable Id="WixUIDialogBmp" Value="..\Graphics\logo.jpg" /> <!-- End UI --> </Product> </Wix>
如果你想要一个主要的升级,请从WiX MajorUpgrade元素开始.升级的一般规则是:
>旧产品的不同ProductCode和PackageCode.
>在前三个字段中的某处增加ProductVersion.
>与旧产品相同的UpgradeCode.
>执行某些操作(如Wix MajorUprade或Upgrade元素)以确保您已进行升级.
>每个用户安装不会升级每个系统安装,反之亦然.
在您的原始情况下,未遵循规则1和2意味着Windows认为已经安装了相同的产品并进入修复模式.这应该是你的第一个警告,因为重大升级看起来像是全新安装,而不是维修.如果在“程序和功能”中有两个条目,则表示尚未满足这4个要求中的一个或多个.如果您收到“已安装此产品的另一个版本”,则表示您未遵循规则1,并且行为的变化与ProductCode和PackageCode值相比与已安装的产品相比较.