旧版COM对象正确停止响应

时间:2014-03-25 18:38:26

标签: c# c++ winforms dynamic com

我有一个用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对象有什么问题?

感谢您的时间。

1 个答案:

答案 0 :(得分:1)

您没有对应用程序的执行环境或线程模型说些什么。

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

如果你这样做,那么确保这个STA线程是访问COM对象的 only 线程。没有编组就没有其他线程可以直接调用它。

必读:"INFO: Descriptions and Workings of OLE Threading Models"

这个问题也可能有关: " StaTaskScheduler and STA thread message pumping"