我的WiX安装程序(Wix 3.10,MSI 4.5)使用MajorUpgrade
进行更新。在预构建中使用heat.exe
收集要安装的文件。当前(较旧的)msi文件包含文件nlog.dll
(随NuGet包v4.1.0
一起提供),文件版本为4.1.0.0
,产品版本为4.1.0
,最后写入时间为2015-09-01
。
由于nlog团队遇到了一些强烈的命名问题,他们发布了一个更新的NuGet包v4.1.1
,其中包含更新的nlog.dll
,其文件版本减少回4.0.0.0
< / strong>虽然其产品版本已增加到4.1.1
,但上次写入时间为2015-09-14
。
现在我遇到了一个相关问题,正如Robbie在这里所做的那样:wix major upgrade not installing all files:当我安装新的msi软件包并执行主要升级时,现在的nlog.dll
(根据正在删除其文件版本,但根据其文件日期和产品版本较旧,但未安装新的nlog.dll
。
但是,建议使用Schedule="afterInstallExecute"
或Schedule="afterInstallFinalize"
对我不起作用。不像在Robbie的情况下那样删除较新的文件而不安装较旧的文件,它不会覆盖当前文件,只是将其留在原位。
长话短说,我希望我的安装程序只需安装随附的所有文件,无论文件/产品/程序集版本是什么。在有效的情况下,需要用较旧的文件替换较新的文件。你不能告诉安装程序引擎忽略文件版本/日期吗?如果没有,我的选择是什么?
答案 0 :(得分:7)
您可以将REINSTALLMODE属性设置为AMUS而不是OMUS。这将影响全球所有组件。
另一个技巧是使用&#34;版本说谎&#34;。这是您使用更高版本创建文件元素的位置。使用heat可能会使这很困难,因为现在你必须在编译之前转换XML。
当然,真正的解决方案是击中nlog团队。但根据我多年来从他们身上看到的情况,它永远不会发生。也许您只是使用资源编辑器来破解DLL并修复&#39;版本#。假设你不需要强大的命名。这对我来说感觉很脏,可能是CM的噩梦。
或者只是转储nlog。 :)
答案 1 :(得分:0)
如果这是一次重大升级,并且您希望在安装新产品之前卸载所有内容,则可以在InstallInitialize或InstallValidate之后安排RemoveExistingProducts。这首先是卸载。
我无法判断您是否正在接受“禁止安装...”问题,但如果您是,并且还有其他客户端(它与其他已安装的产品共享)那么我会看看Dll是否支持私人副本,这样你就可以拥有自己的产品私人副本。如果它与其他产品共享我不会使用版本说谎 - 我将使用Visual Studio打开Dll“打开文件”并更改版本!制作最新的共享版本,因此安装它的每个软件包都可以使用它。
如果它没有与其他产品共享,而您只是遇到了MSI怪癖,那么在CostInitialize之前制作自己的升级元素并安排RemoveExistingProducts,这就是决定不安装的。这可行,但它在MigrateFeatureStates之前,因此您将在主要升级中丢失功能迁移。