如何在c++中激发c#COM事件

How to fire c# COM events in c++?

本文关键字:c#COM 事件 c++      更新时间:2023-10-16

我在c#中有一个接口,我在其中声明了事件,例如:

[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("3839C631-AEDE-4535-9A28-15F4BFCA0C5A")]
public Interface Isample 
{
     event OnAdd(Isample sample);
}
[ClassInterface(ClassInterfaceType.None)]
[Guid("E81B32A2-B98C-48C0-A235-17771EE001D6")]
[ComVisible(true)]
public class Sample:Isample
{
    //'''''''''''''''''''''
}

我想在c#中激发这个事件,并通过firebreath将其监听到javascript中。

提前谢谢。

COM事件与C#事件有很大不同。它们更通用,事件监听器必须实现一个接口,并通过IConnectionPoint告知事件源。然后,事件源只需调用接口方法即可"引发"事件。因此,您需要:

  • 编写一个声明方法而不是事件的接口。因此,在您的情况下,只需void Add(ISample sample)
  • 不要继承类声明中的接口,实现它是事件侦听器的工作
  • 在C#类中声明一个公共事件,该事件的名称与接口中的方法完全匹配
  • 通过告诉CLR接口,允许CLR为您实现IConnectionPointContainer,请使用[ComSourcesInterfaces]属性

MSDN的这篇文章展示了一个例子。

[ComVisible(true)] 
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] 
public interface IComScriptEngineEvents
{
  /// <summary>
  /// 
  /// </summary>
  /// <param name="message"></param>
  [DispId((int)IComScriptEngineEventsDispatchIDs.CompileError)]
  void CompileError(string message);
}

[ClassInterface(ClassInterfaceType.None)]
[ProgId("ScriptEngineComWrapper.ComScriptEngine")]
[ComVisible(true)]
[ComSourceInterfaces(typeof(IComScriptEngineEvents))]
public class ComScriptEngine : IComScriptEngine
{
    [ComVisible(false)]
    public delegate void CompileErrorDelegate(string message); 
    public event CompileErrorDelegate CompileError;
}

然后在comscriptengine中的方法内部调用//这个。CompileError("来自事件!");

我不知道为什么我有这个委托,但出于某种原因,我不得不使用它。来源是几年前写的。

VB脚本测试代码

Sub event_CompileError(strMessage)
  MsgBox strMessage
End Sub

Set objScriptEngine = WScript.CreateObject("ScriptEngineComWrapper.ComScriptEngine", "event_")