English 中文(简体)
将.NET中的事件暴露给COM
原标题:
  • 时间:2009-01-07 18:31:33
  •  标签:

最近我在将.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中必须有对此的隐式支持。其次,使用此方法,我立即失去了委托支持。

Does anyone have any experience with this? Thanks in advance.

最佳回答

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

问题回答

相当简单,你将无法做到这一点。传统的VB不支持非自动化COM(正如你所看到的)。

你需要有一个包装器,可以将你的自动化实例传递给它,这将公开非自动化事件。你实际上需要有两种不同的类型来处理两个不同的客户端事件(自动化启用和非自动化启用)。





相关问题
热门标签