【问题标题】:How to prevent Windows from caching Com Class info?如何防止 Windows 缓存 Com Class 信息?
【发布时间】:2011-01-28 15:27:01
【问题描述】:

Windows 7 正在缓存一些 COM 类信息。较旧的操作系统没有这样做。操作系统查找HKCU\Software\Classes\CLSID\{GUID}\LocalServer32 值后,将其缓存起来,不再查找。

当我们更新我们的软件时,我们将新的更新放在不同的目录中,然后更新HKCU\Software\Classes\CLSID\{GUID}\LocalServer32 值以反映新路径。下次运行该软件时,如果在较旧的 Windows 操作系统下运行,它将使用最新的文件。但是,在 Windows 7 上,它将继续使用旧文件,直到操作系统重新启动。

我运行进程监视器,发现在 Windows 7 下,在第一次读取之后,它再也不会读取注册表项。在较旧的操作系统上,它每次都会读取该密钥。

我的问题是:每次创建新的 out of proc COM 对象时,是否有任何方法可以强制 Windows 7 从 HKCU 配置单元重新读取 LocalServer32 信息?

【问题讨论】:

  • 我想您的 COM 服务器 (.exe) 在初始化期间注册了一些类 (CoRegisterClassObject)。你确定它为所有注册的类调用 CoRevokeClassObject 并在你升级之前退出?
  • 继@SimonMourier 之后,旧进程是否仍在运行或已退出?如果它仍在运行,那是你的问题。
  • 更新COM注册后是否重启了电脑?
  • 在我们取消注册并在不同文件夹中重新注册新版本后,IIS 保留实例化 COM 对象 (Server.CreateObject) 时遇到类似问题。我们的解决方案是重启 IIS(在 LIVE 环境中存在问题),但至少不是重启。
  • @BloodBaz:回收您的应用程序池应该具有与零停机时间相同的效果(正在进行的请求将由现有进程完成,任何后续请求都将由一个新进程提供服务,该进程应该重新读取注册表)。

标签: windows caching windows-7 com registry


【解决方案1】:

我只能通过...解决这个问题

1:停止进程

2:使用 regsvr32 显式注销库(或 exename /unregserver)

3:注册新组件

4:启动进程备份。

我怀疑是 Un Reg 部分对您不利。如果您只是直接更改注册表项,则应改为调用 RegSvr32 /u。

在调用 RegSvr32 时,还要确保新目录位置是当前目录。

请注意,我总是停止该过程然后取消注册,这可能是一个重要的细节。

【讨论】:

    【解决方案2】:

    由于这是 Google 针对这个狭隘问题的最佳结果,我认为添加我针对此问题的故障排除结果会很有价值。

    我在 SO 上找到了这个回复:C# : How to change windows registry and take effect immediately

    该答案的链接解决方案:Registry Watcher C#

    这两种方法似乎都可以在不强制重启的情况下管理更改的密钥。对于我们(如 OP)来说,这是在安装更新时。对我们(可能与 OP 不同)来说,这种情况并不常见,我们决定实施和测试所描述的修复的努力被要求重新启动的简单解决方案所抵消:无论如何,Windows 用户都期望安装软件的过程。

    【讨论】:

      猜你喜欢
      • 2011-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多