可能这不是严格意义上的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"/>
,但我希望有更好的解决方案。因此,请随时回答以下任何问题:
此问题的最佳常见做法是什么?我无法将所有内容打包到单个DLL中,因此我需要一个针对多个DLL的解决方案。
我可以做些什么来启用COM对象的使用(通过对系统的其余部分进行PATH
的更改),而无需重新启动,用户重新登录或资源管理器重新开始? Windows Installer是否广播WM_SETTINGCHANGE
消息?我应该在自定义操作中广播吗?
如果需要,我怎么能检测并要求用户重新启动/重新登录?并非总是如此? (某些机器上不需要重新启动)
我如何安排比重启更少痛苦的事情呢?
答案 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完成它之后的广播而发生无意义的改变。