У меня есть два MSI; framework.msi
и product.msi
. framework.msi
устанавливает dll в GAC, от которого зависит product.msi
как при установке, так и при удалении.
Я создал BA, который связывает два MSI вместе.
<Bundle ...>
<Chain>
<PackageGroupRef Id='framework'/>
<PackageGroupRef Id='product'/>
</Chain>
</Bundle>
<Fragment>
<PackageGroup Id="framework">
<MsiPackage Name="Product Framework"
ForcePerMachine="yes"
SourceFile="framework.msi"
Vital="yes"
Cache="no"
Permanent="no"
Compressed="yes"
Visible="yes"/>
</PackageGroup>
<PackageGroup Id="product">
<MsiPackage Name="Product"
ForcePerMachine="yes"
SourceFile="product.msi"
Vital="yes"
Cache="no"
Permanent="no"
Compressed="yes"
Visible="yes"/>
</PackageGroup>
</Fragment>
Для новых установок мои framework.msi
и product.msi
устанавливаются правильно. Когда я перехожу на новую версию, она успешно обновляет framework.msi
. Затем он продолжает удаление product.msi
, но это не удается (для этой ошибки: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.IO.FileNotFoundException: Could not load file or assembly 'CheckInstaller, Version=1.0.0.0' or one of its dependencies. The system cannot find the file specified.
), поскольку удаление CustomAction
ссылается на версию сборки (CheckInstaller
), которой больше нет в GAC (поскольку она была обновлена как часть обновления framework.msi
). .
Без необходимости писать собственный BA я хочу иметь возможность сделать что-то вроде этого:
// pseudo code
if(product.Exists() && framework.Exists())
{
product.Uninstall(); // product is dependent on the framework
framework.Uninstall();
}
framework.Install();
product.Install();
Я понимаю, что это было бы возможно, если бы мы объединили два MSI в один большой продукт, но поскольку мы распределяем framework.msi
по другим командам и по разным другим причинам, их нужно держать отдельно.
Возможно ли то, что я хочу сделать, с помощью загрузчика WiX?