2009-01-07 76 views
1

最近我遇到了从.NET向COM公开事件的问题。从.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中必须对此进行隐式支持。其次,通过这种方法,我立即失去了委托支持。

有没有人有这方面的经验? 在此先感谢。

回答

0

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

2

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

你必须有一个包装器,你可以传递你的Automation实例来公布非自动化事件。实际上,您必须有两个独立的类型来处理事件的两个单独客户端(启用了自动功能和非自动功能)。