遗留COM对象停止正确响应

本文关键字:响应 COM 对象 遗留 | 更新日期: 2023-09-27 17:53:42

我有一个用c++编写的遗留COM对象。我通过安装程序注册COM库,并在c#包装器应用程序中实例化COM对象,如下所示

Type type = Type.GetTypeFromProgID("GrpSvr.GrpCall");
this.grouperServer = Activator.CreateInstance(type);
string strMsg = this.grouperServer.GroupInit(this.strCommandFilePath, true, true);

,然后使用COM对象进行各种操作,这些调用看起来像

int index = 2;
string strFieldName = "AXR";
this.grouperSever.MakeRec(strFieldName, index);

和这些工作良好(一开始)。然后,调用突然停止返回正确的结果。我可以确认我正在将正确的值传递给给定的方法,并且在某个点随机地,grouperServer对象开始返回垃圾。

我不能在通常意义上调试库,以前没有使用过COM库。我可以在循环中向一个COM方法传递相同的值,并且该方法停止返回正确的结果,这表明这可能是动态语言运行时(DLR)的调用问题。我的问题变成了

我怎么能发现什么是错误的/调试COM对象?

感谢您的宝贵时间。

遗留COM对象停止正确响应

您没有提到应用程序的执行环境或线程模型。

我的猜测:你的COM对象在注册表(ThreadingModel=Apartment)中被标记为STA对象,但在你的c#应用程序中,你没有在具有功能Windows消息循环的STA线程上使用它。

如果你这样做,那么确保这个STA线程是唯一访问COM对象的线程。如果没有封送处理,其他线程不能直接调用它。

必读:"INFO: description and working of OLE Threading Models"。

这个问题也可能与:"StaTaskScheduler和STA线程消息泵送".