无法从 .NET 侦听 VB 6 COM 对象的事件

本文关键字:COM 对象 事件 VB NET 侦听 | 更新日期: 2023-09-27 18:36:53

我们一直在试图理解为什么我们无法从Visual Studio C#/.NET应用程序(现在控制台一个)侦听VB 6 COM对象的事件。COM 对象曾经是旧的 VB 6 应用程序的一部分,该应用程序仍然可以正常工作。它的作用,基本上是与一些后端设备通信,从它们接收称为"Piece"的数据对象,一旦"Piece"到达,它就会触发一个名为"OnPiece"的事件来通知。

注册 COM 对象并从 .NET 引用它没有问题。我们能够在对象浏览器(VS)中浏览它,我们也可以使用它的属性和方法,但不能侦听它的事件。不确定问题是在我们用于侦听事件的代码中还是在 COM 事件本身中。

下面是一些代码片段:

// instantiate the VB6 publisher class 
static ComClass comObj = new ComClass(); 
static void Main(string[] args) {
    // handle the event
    IConnectionEvents_OnPieceEventHandler PieceArraved =
       new IConnectionEvents_OnPieceEventHandler(method_OnPiece);
    comObj.OnPiece += PieceArraved;
}
//the method that matches the signature of the delegate
public static void method_OnPiece(int num1, string str1, int num2, int num3)           {
    // do something here
    Console.WriteLine("OK!"); // this output is never seen
}

请注意:"碎片"确实到达,大约每秒一个,这在使用带计时器的循环时以及尝试访问碎片数据时已经过测试——全部有效。但是,我们不想使用计时器作为解决方法,而是在作品到达后立即通过事件处理收到通知。

任何帮助,不胜感激。

无法从 .NET 侦听 VB 6 COM 对象的事件

好的,我们找到了答案!

问题既不在于与后端正确通信并引发事件的 COM 对象,也不在于代码的 c# 侦听部分。

问题在于我们试图将侦听器的输出(作为证明测试)method_OnPiece作为输出接口显示在控制台中。我们只是在oObj.OnPiece += PieceArraved;之后插入了一个计时器,以允许控制台显示结果,它确实如此。

while (true) { Thread.Sleep(50); }