我对 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/