我们一直试图理解为什么我们无法从Visual Studio C#/ .NET应用程序(现在是控制台)收听VB 6 COM对象的事件。 COM对象曾经是旧的VB 6应用程序的一部分,仍然可以正常工作。它的作用是,它基本上与一些后端设备通信,从它们接收称为“Pieces”的数据对象,一旦“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
}
请注意:“Pieces”确实到达,大约每秒一件,这在使用带定时器的循环时已经过测试,并且在尝试访问Piece数据时 - 一切正常。但是,我们不希望使用计时器作为解决方法,而是在作品到达时通过事件处理得到通知。
感谢任何帮助。
答案 0 :(得分:0)
好的,我们找到了答案!
问题既不在COM对象中,它与后端正确通信并引发事件,也不在代码的c#侦听部分。
问题在于我们尝试将监听器method_OnPiece的输出(作为验证测试)显示为控制台作为输出接口。我们刚刚在oObj.OnPiece += PieceArraved;
之后插入了一个计时器,以允许控制台显示结果,但确实如此。
while (true)
{
Thread.Sleep(50);
}