У меня есть встроенный установщик wix с несколькими функциями: Feature1 и Feature2. При первой установке, если установлены обе функции, то Feature2 удаляется, что не позволяет должным образом удалить Feature1. Я сузил его до Feature2, удалив значение реестра, которое также использует Feature1, в результате чего Feature1 стала рекламироваться.
И Feature1, и Feature2 используют компоненты, которые используются в продуктах нескольких компаний с помощью модулей слияния. Обе функции ссылаются на разные модули слияния, которые ссылаются на одно и то же значение реестра.
<Feature Id="Feature1" Absent="disallow" Level="1" Title="Main Feature" AllowAdvertise="no">
<!--- Component References for Feature1 product are here ---->
<MergeRef Id="CompanyLibrary.msm" />
</Feature>
<Feature Id="Feature2" Absent="disallow" Level="1" Title="Company Library SDK" AllowAdvertise="no">
<MergeRef Id="CompanyLibrarySDK.msm" />
</Feature>
CompanyLibrary.wxs
<?define PackageId = "123..." ?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<Module Id="$(var.ProductShortName)" Language="1033" Version="$(var.ProductVersion)">
<Package Id="$(var.PackageId)" Manufacturer="$(var.Manufacturer)" InstallerVersion="$(var.InstallerVersion)"
Description="$(var.ProductDesc)" Comments="$(var.ProductName)" />
<Directory Id="TARGETDIR" Name="SourceDir" >
<?include ..\ProgramMenu.wxi ?>
<Directory Id="BIN" Name="bin" FileSource="..\..\Source\">
<Component Id="CompanyLibrary.dll" Guid="{1A.....}" DiskId="1" Location="local" SharedDllRefCount="yes">
<File Id="CompanyLibrary.dll" Name="CompanyLibrary" KeyPath="yes" />
</Component>
</Directory>
</Directory>
</Module>
</Wix>
CompanyLibrarySDK.wxs
<?define PackageId = "5678....." ?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<Module Id="$(var.ProductShortName)" Language="1033" Version="$(var.ProductVersion)">
<Package Id="$(var.PackageId)" Manufacturer="$(var.Manufacturer)" InstallerVersion="$(var.InstallerVersion)"
Description="$(var.ProductDesc)" Comments="$(var.ProductName)" />
<Directory Id="TARGETDIR" Name="SourceDir">
<?include ..\ProgramMenu.wxi ?>
<Directory Id="DocumentationFolder" Name="Documentation" FileSource="..\Documents">
<Component Id="CompanyLibrary.chm" Guid="{2B....}" SharedDllRefCount="yes" Location="local">
<File Id="CompanyLibrary.chm" Name="CompanyLibrary.chm" DiskId="1" KeyPath="yes" />
</Component>
<Component Id="Shortcut2CompanyLibrary.chm">
<RegistryValue Id="CompanyLibraryHelpReg" Root="HKCU" Key="Software\Company\Documentation\CompanyLibraryHelp" Type="string" Value="" KeyPath="yes" />
<Shortcut Id="Shortcut2CompanyLibrary"
Target="[!CompanyLibrary.chm]"
Directory="CompanyDocuments"
Name="CompanyLibrary Help File"
Show="normal" />
</Component>
</Directory>
</Directory>
</Module>
</Wix>
А вот файл, вызывающий проблему: ProgramMenu.wxi
<?xml version="1.0" encoding="utf-8"?>
<Include>
<Directory Id="ProgramMenuFolder">
<Directory Id="CompanyShortcuts" Name="Company">
<Component Id="CompanyShortcuts" Guid="{999AAA...}" SharedDllRefCount="yes">
<RegistryValue Id="CompanyShortcutsReg" Root="HKCU" Key="Software\Company" Type="string" Value="" KeyPath="yes" />
<RemoveFolder Id="RemoveCompanyShortcuts" Directory="CompanyShortcuts" On="uninstall"/>
</Component>
<Directory Id="CompanyDocuments" Name="Documentation">
<Component Id="CompanyDocuments" Guid="{98765....}" SharedDllRefCount="yes">
<RegistryValue Id="CompanyDocuments" Root="HKCU" Key="Software\Company\Documentation" Type="string" Value="" KeyPath="yes" />
<RemoveFolder Id="RemoveCommonDocuments" Directory="CommonDocuments" On="uninstall"/>
</Component>
</Directory>
</Directory>
</Directory>
</Include>
Оба параметра RegistryValues, указанные выше, удаляются, когда Feature1 все еще установлен, но Feature2 удален. Я немного упростил код, но, надеюсь, он по-прежнему имеет смысл. Я относительно новичок в WiX и пытаюсь понять этот установщик, который я унаследовал. Насколько я понимаю, не должен ли счетчик ссылок для компонентов CompanyShortcuts и CompanyDocuments отслеживаться окнами или что мне нужно сделать, чтобы окна отслеживали счетчики ссылок для обоих компонентов?