更改PATH后必须重新启动

时间:2014-02-28 12:04:50

标签: windows com wix windows-installer

可能这不是严格意义上的WIX问题,但它应该是一个众所周知的问题,与设置良好的最佳实践有关。我在Google上找不到这些做法。使用WiX 3.6,Windows 7,Visual Studio 2008,但安装必须支持从XP到更新的Windows。

我正在安装一个依赖于某些第三方DLL的COM对象。对象本身已注册正常,并且所有DLL都安装在安装文件夹中,并且安装程序会将此文件夹添加到系统的PATH环境变量中。代码如下所示:

<Component Id="RequiredLibraries" Guid="$(var.RequiredLibrariesGUID)">
    <?include redist.wxi?>
    <Environment Id="PATH" Name="PATH" Value="[INSTALLDIR]" Permanent="no" Part="last" Action="set" System="yes" />
</Component>

在我的机器上,我可以在安装后立即使用该对象,但在某些机器上我必须重新启动计算机。这种重新启动很痛苦,我不知道为什么有必要,也不知道为什么只在某些机器上。我可以<ScheduleReboot After="InstallFinalize"/>,但我希望有更好的解决方案。因此,请随时回答以下任何问题:

  1. 此问题的最佳常见做法是什么?我无法将所有内容打包到单个DLL中,因此我需要一个针对多个DLL的解决方案。

  2. 我可以做些什么来启用COM对象的使用(通过对系统的其余部分进行PATH的更改),而无需重新启动,用户重新登录或资源管理器重新开始? Windows Installer是否广播WM_SETTINGCHANGE消息?我应该在自定义操作中广播吗?

  3. 如果需要,我怎么能检测并要求用户重新启动/重新登录?并非总是如此? (某些机器上不需要重新启动)

  4. 我如何安排比重启更少痛苦的事情呢?

1 个答案:

答案 0 :(得分:1)

我知道有两种情况:

1)应用程序不支持WM_SETTINGCHANGE广播(通常由服务控制管理器托管的任何内容)

2)MSI选择不发送广播时的行为。每WriteEnvironmentStrings Action

(强调补充)

  

正在进行的安装不会更改环境变量   当WriteEnvironmentStrings动作或RemoveEnvironmentStrings时   动作运行。在Windows 2000,Windows Server 2003,Windows XP和   Windows Vista将此信息存储在注册表中   发送WM_SETTINGCHANGE消息以通知系统更改   安装完成时另一个过程可以接收   通过处理这些消息来通知更改。 没有消息   如果系统重新启动正在等待,则发送包可以使用   MsiSystemRebootPending属性用于检查系统是否重启   悬而未决。

我通过编写一个.NET自定义动作(使用环境类)来解决#2问题,这个动作只是为了让MSI完成它之后的广播而发生无意义的改变。