【发布时间】:2019-12-20 16:31:12
【问题描述】:
我的代码如下例所示:
public delegate void ClickDelegate(int x, int y);
public delegate void PulseDelegate();
[Guid("39D5B254-64DB-4130-9601-996D0B20D3E5"),
InterfaceTypeAttribute(ComInterfaceType.InterfaceIsDual)]
[ComVisible(true)]
public interface IButton
{
void Work();
}
// Step 1: Defines an event sink interface (ButtonEvents) to be
// implemented by the COM sink.
[GuidAttribute("1A585C4D-3371-48dc-AF8A-AFFECC1B0967") ]
[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)]
public interface ButtonEvents
{
void Click(int x, int y);
void Pulse();
}
// Step 2: Connects the event sink interface to a class
// by passing the namespace and event sink interface.
// ("EventSource.ButtonEvents, EventSrc").
[ComSourceInterfaces(typeof(ButtonEvents))]
public class Button : IButton
{
public event ClickDelegate Click;
public event PulseDelegate Pulse;
public Button() { }
public void CauseClickEvent(int x, int y) { Click(x, y); }
public void CausePulse() { Pulse(); }
public void Work() { /* Do some stuff */ }
}
这适用于 VB。当我将其定义为:
Dim WithEvents obj As Button
但我想用这样的接口来定义它:
Dim WithEvents obj As IButton
这不起作用,因为从 IButton 界面看不到事件。
有没有办法做到这一点?
【问题讨论】:
-
不,在类型库中,源(或事件)接口是为 coclass 声明的。
-
很好的例子,它极大地帮助了我将 VB6 用户控件迁移到托管代码。