WCF服务中的COM对象

时间:2012-05-26 10:37:32

标签: c# wcf delphi com com-interop

我的WCF服务,用.NET 4.0编写,存在第二个或任何其他调用卡住的问题。 WCF服务除了调用用Delphi XE编写的COM对象之外别无其他。线程模型设置为Both,服务的InstanceContextMode设置为PerCall。该对象并不比BSTR DoRequest(BSTR请求)多得多。 我使用Marshal.ReleaseComObject,但在文章中读到这不是清理com对象的好方法;我也没试过。

我尝试了以下事项:

  • 添加了日志记录以查看WCF服务被卡住的位置。它在COM调用中。
  • 添加了一个未处理的异常处理程序,但没有例外。
  • 检查Delphi对象是否使用静态变量
  • 尝试使用Delphi XE2编译(可能是delphi com库中的错误)
  • 使用多线程Delphi压力测试工具尝试使用Object来查看问题是否存在 同样的,但效果很好。
  • 使用C#console压力测试工具尝试了该对象并获得了与之相同的行为 在WCF服务中。
  • 在创建Object时添加了一个锁定对象,进行调用并销毁 宾语。这没有用。
  • 尝试在WCF中创建一个新线程,并将线程模型设置为STA; 将Delphi对象线程模型设置为Single。这没有用。
  • 尝试在COM +服务中运行Object;这没有帮助。
  • 检查了WCF限制,这设置为100
  • 检查了服务的最大连接数并设置为MaxInt

COM DLL为32位,因此我的VStudio项目设置限制为x86。我在Windows 2008 R2上运行。也许这很重要:Delphi COM对象加载一个C ++ DLL,它可能不是特技。

我使用Reflector + Dennis Bauer FileDisassembler来反编译生成的COM Wrapper。我没有看到任何特别之处。

使用Windebug似乎不是很容易,因为Delphi不支持PDB文件。

用尽了想法,请帮忙: - )

1 个答案:

答案 0 :(得分:2)

我在delphi代码中围绕对第三方dll的所有调用添加了一个关键部分。 看起来它现在正在运作。这并不能解释com对象的行为,但现在它似乎有效。