我们最近决定将VC++可再发行包与我们的应用程序捆绑在一起。不幸的是,这破坏了我们的升级。
旧产品没有正确卸载,仍然存在于添加/删除控制面板和新版本中。如果我正确地理解了它,这会在旧安装程序的所有特性都卸载时发生,这就是为什么我尝试了下面描述的两种方法。如果我不捆绑VC再发行,旧产品将不再出现在控制面板中。
这种行为的原因是什么,我如何解决呢?
公共代码
<MajorUpgrade
DowngradeErrorMessage="There is already a version of [ProductName] installed."
Schedule="afterInstallExecute"
/>
<!-- include the Visual C++ Redistributable -->
<DirectoryRef Id="TARGETDIR">
<?define MergeModulDir= "C:\Program Files (x86)\Common Files\Merge Modules" ?>
<Merge Id="VCRedist86" SourceFile="$(var.MergeModulDir)/Microsoft_VC140_CRT_x86.msm"
DiskId="1" Language="0" />
</DirectoryRef>
版本1:附加功能
<Feature Id="VCRedist" Title="Visual C++ 14.0 Runtime" AllowAdvertise="no"
Display="hidden" Level="1">
<MergeRef Id="VCRedist86" />
</Feature>
<Feature Id="App" Title="Main Application" Level="1">
<ComponentGroupRef Id="App" />
<ComponentRef Id="ApplicationShortcut" />
<ComponentRef Id="CleanRegistry" />
<ComponentGroupRef Id="SendToShortcuts" />
</Feature>
版本2:内部现有功能
<Feature Id="App" Title="Main Application" Level="1">
<ComponentGroupRef Id="App" />
<ComponentRef Id="ApplicationShortcut" />
<ComponentRef Id="CleanRegistry" />
<ComponentGroupRef Id="SendToShortcuts" />
<MergeRef Id="VCRedist86" />
</Feature>
发布于 2017-08-07 18:08:28
我会用详细的日志进行升级,看看到底发生了什么。特别是查看应用于升级的FindRelatedProduct事件(将有几次),并查看是否存在任何内容。
下面是我的猜测:一些C++合并模块强制每个系统安装一个。如果现有安装的产品是每个用户的,那么升级就不会发生,因为它是跨上下文的,因此您需要使用旧的和已安装的产品。我不知道当您提到“当旧安装程序的所有功能都已卸载时”时,您看到了什么,但是升级是对旧产品的卸载,因此没有理由将其部分抛在后面。具体来说,请查看合并模块的属性表,看看它是否有ALLUSERS=1条目。
https://stackoverflow.com/questions/45542293
复制相似问题