Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 嵌入式Mono:如何在C++;? 我正在研究一个嵌入MNO的应用程序,我想把一个事件从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); }_C#_C++_Events_Mono - Fatal编程技术网

C# 嵌入式Mono:如何在C++;? 我正在研究一个嵌入MNO的应用程序,我想把一个事件从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); }

C# 嵌入式Mono:如何在C++;? 我正在研究一个嵌入MNO的应用程序,我想把一个事件从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); },c#,c++,events,mono,C#,C++,Events,Mono,但是,raiseMethod总是返回为NULL。看看MonoEvent的结构,看起来像是填充了add和remove方法,但没有填充raise?我有什么特别的事情要做才能让它工作吗 编辑:如果重要的话,这里是我在C#层中使用的委托、类和事件的(基本)形式 可以在父类中定义事件吗?如果是这样的话,您需要使用如下内容遍历类层次结构: MonoEvent* monoEvent; while (klass) { void* itr = NULL; while(monoEvent= mono

但是,raiseMethod总是返回为NULL。看看MonoEvent的结构,看起来像是填充了add和remove方法,但没有填充raise?我有什么特别的事情要做才能让它工作吗

编辑:如果重要的话,这里是我在C#层中使用的委托、类和事件的(基本)形式


可以在父类中定义事件吗?如果是这样的话,您需要使用如下内容遍历类层次结构:

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方法为空是正常的

对于使用C#event关键字或Visual Basic event关键字声明的事件,此方法通常返回null。这是因为C#和Visual Basic编译器在默认情况下不会生成这样的方法

()

恐怕很难触发一个班级事件。因为它实际上打破了.NET中事件的概念,即类本身只能触发自己的事件。事实上,即使是从C#开始,也很难提出其他级别的事件

从概念上讲,事件是一对add_处理程序和remove_处理程序方法,您可以在其中指定在事件发生时要调用的委托。这取决于类如何实现事件。从技术上讲,这只是一个私人代理字段,AFAIK。 你可以试着找到它


我不确定这是否是一种正确的方法,但中的一个答案描述了如何使用反射引发事件。您可以尝试将其转换为mono_类/mono_字段调用等。

Krizz的答案是最完整的。这就是我如何修复代码,使其以我“期望”的方式工作

我把C#面改为:

然后用

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

不。通过调试,我已经验证了我是否正确地恢复了事件。只需mono\u event\u get\u raise\u方法返回null。get_add_方法和get_remove_方法返回值。呸,快告诉我了。不管怎么说,这几乎就是.NET中的惯例。关于事件的文档使用它(以及相关的),并且它在框架类中也被广泛使用。次要旁白:命名约定将使
输入
退出
成为事件字段的“正确”名称,而
onering()
/
OnExiting
应用于引发事件字段的方法。
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);