我有一个用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对象有什么问题?
感谢您的时间。
答案 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"