最近我遇到了将事件从.NET暴露给COM的问题。

我在这个例子中取得了成功(概念上取自 http://blogs.msdn.com/andreww/archive/2008/10/13/exposing-events-from-managed-add-in-objects.aspx ):

//我们自定义事件的委托类型。

[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中必须有一个隐含的支持。其次,通过这种方法,我立即失去了代表支持。

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

有帮助吗?

解决方案 2

好的,所以我通过实现经典的COM IConnectionPointCointainer,IConnectionPoint和IConnection(以及枚举接口)来实现这一点。它没有集成到.NET委托/事件模型中,但可以工作。

其他提示

很简单,你将无法做到这一点。 Classic VB不支持非自动化COM(如您所见)。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top