c# - 通过 COM 从 Delphi 触发 .NET DLL 中的事件的问题

标签 c# delphi events com c#-3.0

我对 COM 对象和触发事件有疑问。我有:

  • 用 C#.NET (3.5) 编写的 DLL,用于触发事件
  • Delphi5 中的一个应用程序,它使用 DLL 作为 COM 对象。

到目前为止一切顺利。事件是这样的: - 在 DLL 中有 2 个事件。一个是内部的,不是 COM 可见的。第二个是外部的,对 COM 可见 - DLL中还有一个OnChanged函数,连接内部事件,触发外部事件。所以基本上每次内部事件被触发时,外部事件也是如此。 - 这个 OnChanged 函数也是 COM 可见的,可以从 Delphi 应用程序调用

我用了this solution为了让整个工作正常进行,我可以成功地将 Delphi 过程绑定(bind)到 .NET 事件,但有一个问题: - 如果我从 Delphi 应用程序调用 OnChanged,一切都很顺利 - 绑定(bind)的 Delphi 函数将与(显然).NET 函数一样执行 - 如果 DLL 从 .NET 中的回调函数调用 OnChanged,绑定(bind)的 Delphi 函数将不会执行。

底线:如果我从 Delphi 触发外部事件,一切正常。如果 DLL 触发了内部事件,则 Delphi 中不会发生任何事情(尽管肯定会触发外部事件)。

非常感谢任何想法!

最佳答案

如果不调试实际代码很难回答这个问题,但我会告诉您我过去在 COM 互操作方面遇到的一个问题。

您可能想考虑的一种可能性是 GC 正在释放事件连接。当你附加到一个对象上的事件时,该事件通常会在附加程序上引用,并且两个对象都不会被 GC 清理,但是当你有一个 COM 对象时,GC 不一定知道该引用并且它可以清理其中一个对象。我过去在通过 .net 进行 Office 自动化时遇到过这种情况。解决这个问题的方法是保留对 COM 对象的引用并附加到它。

例如这是不好的:

public class Foo
{
  public Foo(ICOMObject obj)
  {
    obj.Changed += OnChanged;
  }

  private void OnChanged(object arg)
  {
  }
}

如果 obj 是一个 .net 对象,这将工作得很好。只要其中一个对象仍然被引用,该事件就会保持连接状态。但是,这不适用于 COM 对象。对于 COM 对象,事件似乎只是在某个时间点停止工作,通常很快。

试试这个:

public class Foo
{
  ICOMObject obj;
  public Foo(ICOMObject obj)
  {
    this.obj = obj;
    this.obj.Changed += OnChanged;
  }

  private void OnChanged(object arg)
  {
  }
}

我不确定这是你的问题,但它可能是。祝你好运!

关于c# - 通过 COM 从 Delphi 触发 .NET DLL 中的事件的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3512346/

相关文章:

c# - 从数组中查找相等或最接近的较小值

listview - 在 RAD Studio 10 Seattle 中,我的 ListView 的属性 ".Text"和 ".Detail"带有下划线作为错误。我该如何解决?

delphi - TClientDataSet.ApplyUpdates() 不应用更新

arrays - 如何在 Delphi 中正确地转换和传递参数

javascript - 检测 html 选择框上的程序更改

javascript - JS 调度事件

c# - 按任意时间间隔对 DateTime 进行分组

c# - 使用 WCF 查询 eBay API

javascript - jQuery UI 可排序事件 - 单击并发送到末尾

c# - SSL TcpClient C# .Net Compact Framework 1.0