最近我遇到了从.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中必须对此进行隐式支持。其次,通过这种方法,我立即失去了委托支持。
有没有人有这方面的经验? 在此先感谢。