最近我在将.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.