C#到VB6 COM事件(“对象或类不支持事件集”)

真的把这头发拉出来……

我有一个C#项目,其接口定义为:

/* Externally Accessible API */ [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] public interface ISerial { [DispId(1)] bool Startup(); [DispId(2)] bool Shutdown(); [DispId(3)] bool UserInput_FloorButton(int floor_number); [DispId(4)] bool Initialize(); } /* Externally Accesssible Event API */ [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] public interface ISerialEvent { [DispId(5)] void DataEvent(); } [ComSourceInterfaces(typeof(ISerialEvent), typeof(ISerial))] [ClassInterface(ClassInterfaceType.None)] public class SerialIface : ISerial { public delegate void DataEvent(); public event DataEvent dEvent; public bool Initialize() { //testing the event callback if (dEvent != null) { dEvent(); } } ... } 

VB6代码看起来像:

 Private WithEvents objSerial As SerialIface Private Sub objSerial_DataEvent() 'do something happy' End Sub Public Sub Class_Initialize() Set objSerial = New SerialIface '<---this is the line that fails' Call objSerial.Initialize '<--Initialize would trigger DataEvent, if it got this far' End Sub 

好吧,正常的API类型函数似乎正在工作(如果我声明没有WithEvents关键字的objSerial),但我不能在我的生活中让“DataEvent”工作。 它失败了“对象或类不支持事件集”消息。

我原本把这两个接口混为一谈,但后来C#抱怨DataEvent没有在类中定义。 目前的方式,我能够在VB6对象浏览器中完美地查看所有API和一个事件 – 一切看起来都在那里……我无法让它真正起作用!

我确信我错过了一些显而易见的事情或者做了一些愚蠢的事情 – 但我对整个互操作业务都很陌生,所以它完全逃脱了我。

救命!

看这篇文章。

具体来说,看起来你错过了一个看起来像这样的声明。

 [Guid("9E5E5FB2-219D-4ee7-AB27-E4DBED8E123E"), ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(DBCOM_Events))] public class DBCOM_Class : DBCOM_Interface { 

你有这个部分

 // // Events interface Database_COMObjectEvents [Guid("47C976E0-C208-4740-AC42-41212D3C34F0"), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] public interface DBCOM_Events { } 

但是没有第二个,COM对象的vtable和typelib没有使用VB6(或其他COM消费者)所需的事件映射。

您可以使用Google搜索字词“com event”c#并获得一堆其他好的结果。

你的post确实引导我找到解决方案 – 谢谢!

毫不奇怪,它结果是一个错字。

 /* Externally Accesssible Event API */ [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] public interface ISerialEvent { [DispId(5)] void DataEvent(); } 

应该

 /* Externally Accesssible Event API */ [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] public interface ISerialEvent { [DispId(5)] void dEvent(); } 

我使用委托而不是事件来定义接口

再次,谢谢你的帮助!