2013-12-10 18 views
1

我在C#中的接口中,我已宣佈事件,例如:如何在C++中激發c#COM事件?

[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#這種情況下,它聽成JavaScript通過firebreath。

在此先感謝。

+0

「我想火在C#這個事件」,其中標籤C++進來呢? –

+0

在火中呼吸Roman R. – stack

回答

4

COM事件與C#事件有很大不同。它們更通用,事件聽衆必須實現一個接口並通過IConnectionPoint告訴事件源。事件源通過調用接口方法然後「引發」一個事件。因此您需要:

  • 編寫一個聲明方法的接口,而不是事件。所以你的情況只需void Add(ISample sample)
  • 不要在類聲明中繼承接口,它是事件偵聽器的工作來實現它。
  • 在C#類名完全相同的方法相匹配的接口
  • 允許CLR告訴它有關的接口來實現的IConnectionPointContainer你,使用[ComSourcesInterfaces]屬性聲明一個公共事件。

這個MSDN article顯示了一個例子。

0
[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 //this.CompileError("from事件的方法裏面「)!;

我不知道爲什麼我有這個委託,但由於某種原因,我不得不使用它。來源是幾年前寫的。

VB腳本Testcode

Sub event_CompileError(strMessage) 
    MsgBox strMessage 
End Sub 


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

感謝Hans Passant和user743414!它通過使用IConnectionPointContainer來解決。 :) – stack