一个C++客户端无法使用我们新的 COM 注册的 .NET .dll加载,另一个客户端可以正常工作

One C++ client fails to load with our new COM registered .NET .dll, another works

本文关键字:客户端 另一个 常工作 工作 加载 NET C++ 我们 一个 注册 COM      更新时间:2023-10-16

我们有一个旧的 C/C++ .dll,客户通过 COM 访问它。

我们试图用编写的新 .NET 替换旧.dll。

客户无法重新编译其客户端,因此重要的是旧.dll可以简单地替换为COM取消注册/注册新(使用regsvr32/regasm(。

我们相信我们已经使用与旧 COM 接口相同的 COM 接口构建了 .NET .dll;GUID、名称、分发等都匹配。我们已经通过编写自己的C++测试应用程序来验证这一点,当我们取消注册旧.dll/注册新时,它将继续工作。

问题是客户的客户端无法启动。

奇怪的是,如果我们让旧.dll注册(例如,两个.dll都被注册(,它会起作用;客户的应用程序在我们的新.dll中启动和调用方法。但是一旦我们取消注册旧.dll应用程序就无法重新启动。

我们尝试了不同的方法来注册新.dll;使用带有/codebase 选项、/tbl 等的 regasm。

如果我使用 OLE/COM 查看器进行检查,我可以看到新旧.dll之间的一些细微差异,例如类型库"名称"不同。但我想既然我们自己的C++测试客户端可以使用任一.dll COM 接口是否足够相似?

拜托,有人知道吗?一个C++客户端怎么可能加载我们的新.dll而另一个客户端失败?如果我们让旧.dll与新并行注册,为什么两者都有效?有什么解释为什么两个C++客户端的行为不同吗?


更新:客户端中的错误消息显示:

"运行时失败:CLSIDFromProgID。检查 [myDll].dll 是否已注册。

亲切的问候 P.T

有很多可能性。首先,请确保注册新 DLL 的类型库。旧的可能是DllRegisterServer的一部分,但AFAIK,.Net DLL没有。在REGTLB.exe注册。

还要检查两个 DLL 中的线程模型是否相同。

如果这些都无济于事,我建议你继续下去,直到 OLEVIEW 说它们是相同的——你永远不知道客户在做什么,这与你的不同。