2

我有一个类似的问题,如 forki23,通过在升级期间使用 Wix 来不覆盖配置文件。我有一个配置文件,在升级过程中不应被覆盖,但在卸载过程中应将其删除。但是,我找到的每个解决方案都会破坏其他东西。

如果我设置NoOverwrite=yes 并将 RemoveExistingProducts 移动到 InstallFinalize配置文件将按照我的意愿进行处理。但是,在这种情况下,由于某种原因,在升级过程中会删除快捷方式。如果我在 InstallInitialize 处保留 RemoveExistingProducts,则配置文件实际上在升级期间被删除,但是存在快捷方式。

为什么会发生这种情况,有没有办法解决它?

<InstallExecuteSequence>
   <RemoveExistingProducts After="InstallInitialize" />
   <!-- InstallInitialize causes config-file to disappear during upgrade -->
   <!-- InstallFinalize causes shortcuts to disappear during upgrade -->

...

<Property Id="DISABLEADVTSHORTCUTS" Value="1" />

...

<Directory Id="INSTALLLOCATION" Name="MyApp">
  <Component Id="MYAPP.EXE" DiskId="1" Guid="...">
    <File Id="MYAPP.EXE" Name="MyApp.exe" Source="..." Vital="yes" KeyPath="yes">
      <Shortcut Id="startmenuShortcut" 
                Directory="ProgramMenuDir" 
                Name="!(loc.ProductName)" 
                WorkingDirectory='INSTALLLOCATION' 
                Icon="Icon.ico" 
                IconIndex="0" 
                Advertise="yes"  />
    </File>
    <RegistryValue Root="HKLM" 
                    Name="InstallLocation" 
                    Key="$(var.InstallLocationRegistryKey)" 
                    Type="string" 
                    Value="[INSTALLLOCATION]">
    </RegistryValue>
  </Component>
  <Component Id="MYAPP.EXE.CONFIG" DiskId="1" Guid="..." NeverOverwrite="yes">
    <File Id="MYAPP.EXE.CONFIG" 
          Name="MyApp.exe.config" 
          Source="..." 
          KeyPath="yes" />
  </Component>
...
</Directory>

...

<Directory Id="ProgramMenuFolder">
    <Directory Id="ProgramMenuDir" Name="!(loc.ProductPrefix)">
        <Component Id="ProgramMenuDir" Guid="...">
            <RegistryValue Root="HKCU" Key="SOFTWARE\MyApp" 
                           Type="string" Value="[INSTALLLOCATION]" KeyPath="yes" />         
            <RemoveFolder Id="ProgramMenuDir" On="uninstall"/>
        </Component>
    </Directory>
</Directory>

注意 A:配置文件是机器范围的配置,应该适用于所有用户。

注 B:我使用的是 WiX 3.7,目标平台是 Windows 7 和 8。

4

3 回答 3

0

理论上“NoOverwrite=yes 并将 RemoveExistingProducts 移动到 InstallFinalize”应该可以工作,但很明显我们正在从大局中失去一些东西。查看 Windows Installer 为何删除快捷方式的最佳方法是在启动升级设置时创建详细日志。您可以使用以下命令在 cmd.exe 中执行此操作:msiexec /i [msi path] /L*V debug.log

发布日志的下载链接和托管快捷方式的组件的 GUID,以便我们查看日志是否有助于我们了解发生的情况。

于 2013-08-08T19:01:20.937 回答
0

Windows 安装程序在这些事情上的工作非常准确,如果在 After="InstallFinalize" 情况下删除了任何内容,这意味着一个组件已被删除,MSI 认为不需要,因为未包含在您的新版本的 msi 中文件。确保包含 MYAPP.exe 的组件的 GUID 和快捷方式在您的新版本中没有更改。(与 Orce 或 Insted 等工具进行比较)。好像有!

MSI 仅删除完整组件,而不仅仅是快捷方式。真的!也许您在 Windows 中遇到了快捷方式的更新问题。有时会发生这样的事情。尝试重新启动以确保发生这种情况,您的想法。也许您的测试过程中有错误(或者是上面提到的 GUID 问题)。如果您没有删除快捷方式的自定义操作,或者您尝试将快捷方式添加为文件或此类危险的东西,则没有太多其他可能性。

将快捷方式放在与 .exe 相同的组件中很常见,但在我看来并不是最佳选择!我建议尽可能地分离资源,所以把它放在一个自己的组件中。如果您以后想重命名快捷方式,这有好处。然后您可以只更改此组件的 GUID,而不会触及重要的 .exe 文件。

这样做有一个小缺点,在重装情况下失去了与文件版本 MYAPP.exe 的直接连接,因此如果 MYAPP.exe 是多个不同设置之间的共享文件,则不建议这样做。完美的解决方案是可能的,但不是这里的重点。

于 2013-08-09T15:38:36.783 回答
-1

解决方法:如果您仍然能够更改旧的(第一个)msi 设置,只需将组件 MYAPP.EXE.CONFIG 标记为永久。那么在Major Upgrade的时候就不会卸载了(但是根本没有卸载,有什么优缺点,也就是说,对于.config文件来说大部分都是可以接受的)。

如果您的设置的版本 1 已经发布,那么您也可以使用一些技巧来做同样的事情。

于 2013-08-09T15:48:40.590 回答