我们最近决定将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>
最佳答案
我会用一个详细的日志来升级,看看发生了什么。特别是查看适用于您的升级的findRelatedProduct事件(将有多个),并查看是否存在任何内容。
这是我的猜测:一些C++合并模块强制每个系统安装。如果现有的已安装产品是针对每个用户的,则不会进行升级,因为它是跨上下文的,只会留下旧的和已安装的产品。我不知道你看到了什么,当你提到“当不是所有的旧安装程序的功能都被卸载”,但升级是旧产品的卸载,所以没有理由留下它的一部分。更具体地说,在合并模块的属性表中查看它是否有allusers=1条目。