【问题标题】:Legacy COM Object Stops Responding Correctly旧版 COM 对象停止正确响应
【发布时间】:2014-03-25 18:38:26
【问题描述】:

我有一个用 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 对象[您会使用本机代码],因此我问'我如何才能找出 COM 对象有什么问题'。不幸的是,您将“千里眼”这个词误认为“经验”。
  • 不。你没有提供你的 COM 对象或某种方式来识别它,所以任何回答的人都必须列出所有可能做错的事情,并且可能会在一段时间内起作用,或者是经过认证的通灵者。
  • 老兄,如果你帮不上忙,那就做一个。我已经明确表示,我自己无法访问 COM 库代码,我想知道如何才能找到问题所在。可能存在许多问题,是的,但是,某人(显然不是您自己)在这方面有丰富的经验(使用旧的 COM 库)并且遇到了这个确切的问题。如果你不能帮助我,为什么要浪费你自己的时间来评论。附言。那是修辞。

标签: c# c++ winforms dynamic com


【解决方案1】:

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

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

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

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

这个问题也可能相关: “StaTaskScheduler and STA thread message pumping”。

【讨论】:

  • 非常感谢您的回复。这正是我想要的那种铅。我正在使用 dynamic 和主 [UI] 线程上执行此代码,有时在后台线程池线程上通过 .NET4.0 TPL(使用 Task.Factory.StartNew(() => ...))。我现在会阅读链接...再次感谢您的宝贵时间。
  • @Killercam,没问题。根据您的 UI 框架,使用Control.InvokeDispatcher.Invoke 从除 UI 线程之外的任何线程访问您的 COM 对象。我认为您的问题被不公平地否决了。
猜你喜欢
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
  • 1970-01-01
  • 2013-03-21
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 2011-07-05
相关资源
最近更新 更多