将事件从.NET公开到COM

将事件从.NET公开到COM,.net,events,com,interop,iunknown,.net,Events,Com,Interop,Iunknown,最近,我在将事件从.NET公开到COM时遇到了一些问题 我成功地使用了这个示例(概念上取自): //自定义事件的委托类型 [ComVisible(false)] public delegate void SomeEventHandler(object sender, EventArgs e); // Outgoing (source/event) interface. [ComVisible(true)] [InterfaceType(ComInterfaceType.InterfaceIsI

最近,我在将事件从.NET公开到COM时遇到了一些问题

我成功地使用了这个示例(概念上取自):

//自定义事件的委托类型

[ComVisible(false)]
public delegate void SomeEventHandler(object sender, EventArgs e);

// Outgoing (source/event) interface.
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IAddInEvents
{
    [DispId(1)]
    void SomeEvent(object sender, EventArgs e);
}

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[ComSourceInterfaces(typeof(IAddInEvents))]
public class AddInUtilities :
{       
    // Event field. This is what a COM client will hook up
    // their sink to.
    public event SomeEventHandler SomeEvent;

    inernal void FireEvent(object sender, EventArgs e)
    {
        if (SomeEvent != null)
        {
            SomeEvent(sender, e);
        }
    }
}
这很好,因为IAddInEvents接口定义为IDispatch。但是,我需要发布一个名为IUnknown的事件源接口。我无法控制事件接口,因为它来自第三方库(它也是已发布事件的使用者)。每当我尝试挂接到事件时,VB环境(我尝试接收事件的地方)就会崩溃,第三方产品(ESRI ArcMap)使用的VBA环境也会崩溃

我已经能够(部分)手动实现IConnectionPointContainer接口(COM在后台使用该接口来处理事件),然后我能够接收事件并逐步实现IConnectionPointContainer。然而,对我来说,这似乎是一种过激的行为,我认为在.NET中必须有一种隐含的支持。其次,使用这种方法,我会立即失去代表的支持

有没有人有这方面的经验?
提前谢谢。

很简单,你不能这样做。Classic VB不支持非自动化COM(如您所见)


您必须有一个包装器,可以将您的自动化实例传递给它,该实例将公开非自动化事件。实际上,您必须有两种独立的类型来处理事件的两个独立客户端(启用自动和非启用自动)。

好的,因此我已经能够通过实现经典的COM IConnectionPointCointainer、IConnectionPoint和IConnection(加上枚举接口)来实现这一点。它不集成到.NET委托/事件模型中,但可以工作。

您能为我们提供更详细的解决方案描述吗?