簡體   English   中英

嵌入式單聲道:如何在C ++中引發事件?

[英]Embedded Mono: How do you raise an event in C++?

我正在開發一個嵌入Mono的應用程序,我想將一個事件從C ++層引發到C#層。 這就是我所擁有的:

 void* itr(NULL);
 MonoEvent* monoEvent;
 while(monoEvent= mono_class_get_events(klass, &itr))
 {
     if(0 == strcmp(eventName, mono_event_get_name(monoEvent)))
         raiseMethod = mono_event_get_raise_method(monoEvent);
 }

但是,raiseMethod總是以NULL形式返回。 看一下MonoEvent的結構,看起來像是添加和刪除方法,但不是加注? 為了讓它發揮作用,我有什么特別的事要做嗎?

編輯:如果重要,這里是我在C#層使用的委托,類和事件的(基本)形式。

public delegate void MyHandler(uint id);
public class SimpleComponent : NativeComponent
{
    public event MyHandler OnEnter;
    public event MyHandler OnExit;
}

可以在父類中定義事件嗎? 如果是這樣,您需要使用以下內容遍歷類層次結構:

MonoEvent* monoEvent;
while (klass)
{
    void* itr = NULL;
    while(monoEvent= mono_class_get_events(klass, &itr))
    {
       if(0 == strcmp(eventName, mono_event_get_name(monoEvent)))
         raiseMethod = mono_event_get_raise_method(monoEvent);
   }
   klass = mono_class_get_parent(klass);
}

評論和重讀問題后編輯

事件的raise方法為NULL是正常的。

對於使用C#事件關鍵字或Visual Basic Event關鍵字聲明的事件,此方法通常返回null。 這是因為默認情況下C#和Visual Basic編譯器不生成這樣的方法。

來源

我擔心可能很難發動課堂活動。 因為它實際上打破了.NET中事件的概念 - 它說類本身只能觸發自己的事件。 實際上,即使是C#也很難引起其他類的事件。

從概念上講,事件是add_handler和remove_handler方法的對,您可以在其中指定在事件發生時要調用的委托。 它是如何實現事件的。 從技術上講,它只是一個私人代表領域,AFAIK。 您可以嘗試找到它。

我不確定它是否是一種正確的方法,但是如何通過.NET / C#中的反射來引發事件? 描述了如何使用反射引發事件。 您可能會嘗試將其轉換為mono_class / mono_field調用等。

Krizz的答案是最完整的。 這就是我修復代碼以實現“期望”的方式。

我將C#側改為:

public delegate void MyHandler(uint aEntityId);
public class SimpleComponent: NativeComponent
{
    public event MyHandler OnEnter;
    public event MyHandler OnExit;

    protected void CallOnEnter(uint aEntityId)
    {
        if (OnEnter != null)
            OnEnter(aEntityId);
    }

    protected void CallOnExit(uint aEntityId)
    {
        if (OnExit!= null)
            OnExit(aEntityId);
    }
}

然后抓住單聲道方法

raiseMethod = mono_class_get_method_from_name(klass, "CallOnEnter", 1);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM