Windows 更改路径后必须重新启动

Windows 更改路径后必须重新启动,windows,com,wix,windows-installer,Windows,Com,Wix,Windows Installer,这可能不是严格意义上的WIX问题,但它应该是一个众所周知的问题,与建立良好的最佳实践有关。我只是在谷歌上找不到这些做法。使用WiX 3.6、Windows 7、Visual Studio 2008,但安装必须支持从XP到更高版本的Windows 我正在安装依赖于某些第三方DLL的COM对象。对象本身注册正常,所有DLL都安装在安装文件夹中,安装程序将此文件夹添加到系统的PATH环境变量中。代码如下所示: <Component Id="RequiredLibraries" Guid="$(v

这可能不是严格意义上的WIX问题,但它应该是一个众所周知的问题,与建立良好的最佳实践有关。我只是在谷歌上找不到这些做法。使用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>

在我的机器上,我可以在安装后立即使用该对象,但在某些机器上,我必须重新启动计算机。这次重启很痛苦,我不知道为什么需要重启,也不知道为什么只在某些机器上重启。我可以
,但我希望有更好的解决办法。因此,请随意回答以下问题:

  • 这个问题的最佳常见做法是什么?我不能把所有的东西都打包到一个DLL中,所以我需要一个针对多个DLL的解决方案

  • 我可以做些什么来启用COM对象的使用(通过使对
    路径的更改对系统的其余部分可见),而无需重新启动、用户重新登录或资源管理器重新启动?Windows Installer是否广播
    WM\u设置更改
    消息?我应该在自定义操作中播放它吗

  • 我如何检测并要求用户仅在需要时重新启动/重新登录,而不是总是这样?(某些计算机上不需要重新启动)

  • 我怎样才能安排一些比重新启动更轻松的工作呢


  • 我知道有两种情况:

    1) 应用程序不支持WM_设置更改广播(通常是服务控制管理器托管的任何内容)

    2) MSI选择不发送广播时的一种行为。Per:

    (增加重点)

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


    我已经通过编写一个.NET自定义操作(使用Environment类)解决了#2的问题,该操作进行了无意义的更改,只是为了让广播在MSI完成后发生。

    进程在开始时读取环境。所以你必须重新启动进程。这不需要重新启动,而是需要注销/登录周期。但有一个类似窗口的消息,您可以发送给所有进程,而其他进程可以处理此消息。托管COM对象的进程是什么?它运行在什么上下文中?@ChristopherPaint不知道如何了解上下文,但我相信客户端进程正在托管该对象(因此我推断Explorer对环境变化一无所知)。线程模型是公寓。接口类派生自
    CComObjectRootEx