我是wix的新手,以前,我试图解决重大升级更新所有配置文件的问题。我设法通过在RemoveExistingProduct之后修改installExecute来修复它。但是,它给我带来了一个新的问题,我用当前项目生成的包之间的主要升级很好,但是有一个旧的msi包(有相同的升级代码),当我用那个旧包进行主要升级时,它会删除所有的东西,只有在我修复后才能重新显示文件。在日志中
1: msvcp140_2.dll 2: 3: 4: 5: 6: 7: 8: 9: C:\Folders\
MSI (s) (5C:04) [18:29:11:453]: Verifying accessibility of file: msvcp140_2.dll
MSI (s) (5C:04) [18:29:11:453]: Note: 1: 2318 2:
MSI (s) (5C:04) [18:29:11:453]: Note: 1: 2318 2:
MSI (s) (5C:04) [18:29:11:454]: Executing op: FileRemove(,FileName=msvcp140_codecvt_ids.dll,,)
任何帮助都将不胜感激!
发布于 2022-01-12 20:47:24
我能给你的最好的建议是MSI想拥有它安装的文件,而忽略它不安装的文件。
因此,如果MSI安装了一个文件v1,并且用户对它进行了修改,那么当稍后的MSI安装文件v2时,如果它覆盖它或不覆盖它,那么它将是错误的。
您可以编写自定义操作,从文件中获取用户数据,并在MSI覆盖文件后重新应用这些操作,但这会变得乏味。
我的一般建议是将应用程序设计成有两个配置文件。
app.config (由MSI安装,用户不修改) app-override.config (未由MSI安装,用户数据存储在这里)
然后,应用程序读取并合并内存中的两个文件。这样,MSI就可以安全地覆盖文件,而不会造成任何伤害,用户数据不会丢失,来自v2的新数据也不会丢失。
通过这种方式,这一切都非常简单和简单,您可以将您的RemoveExistingProducts调度设置回到最初的位置。
如果这是一个.NET应用程序,那么.NET ConfigurationManager类已经支持这种模式。AppSettings元素有一个File属性,它可以指向要合并的第二个文件。
https://stackoverflow.com/questions/70675164
复制相似问题