【发布时间】: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