我们有一个客户通过 COM 访问的旧 C/C++ .dll。
我们已经尝试用 i .NET 编写的新 .dll 替换旧的 .dll。
客户无法重新编译他们的客户端,因此旧的 .dll 可以简单地通过 COM 取消注册/注册新(使用 regsvr32 / regasm)替换,这一点很重要。
我们相信我们已经构建了具有与旧 COM 接口相同的 COM 接口的 .NET .dll;GUID、名称、dispid 等都匹配。我们已经通过编写自己的 C++ 测试应用程序验证了这一点,当我们取消注册旧的 .dll / 注册新的 .dll 时,它会继续工作。
问题是客户的客户端无法启动。
奇怪的是,如果我们保留旧的 .dll 注册(例如,两个 .dll 都已注册)它可以工作;客户的应用程序启动并调用我们新的 .dll 中的方法。但是,一旦我们取消注册旧的 .dll,应用程序就无法再次启动。
我们尝试了不同的方法来注册新的.dll;将 regasm 与 /codebase 选项、/tbl 等一起使用。
如果我使用 OLE/COM 查看器进行检查,我可以看到新旧 .dll 之间的一些细微差别,例如类型库“名称”不同。但我想既然我们自己的 C++ 测试客户端可以与任何一个 .dll 一起使用,那么 COM 接口是否足够相似?
请问,有人知道吗?一个 C++ 客户端如何加载我们的新 .dll 而另一个失败?如果我们让旧的 .dll 与新的 .dll 并行注册,为什么两者都可以工作?有什么解释为什么两个 C++ 客户端的行为不同吗?
更新:客户端中的错误消息说:
“运行时失败:CLSIDFromProgID。检查 [myDll].dll 是否已注册。”
亲切的问候 PT