嵌入式单声道:如何在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的结构来看,似乎填充了add和remove方法,但没有填充raise?为了让它发挥作用,我有什么特别的事情要做吗?
编辑:如果重要的话,下面是我在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);
}
评论和重读问题后编辑:
事件的引发方法为NULL是正常的。
对于用C#event关键字或Visual Basic event关键字声明的事件,此方法通常返回null。这是因为C#和Visual Basic编译器默认情况下不会生成这样的方法。
(来源)
恐怕很难激发一个班级的兴趣。因为它实际上打破了.NET中事件的概念,即类本身只能激发自己的Event。事实上,即使从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);
相关文章:
- Android NDK传感器向事件队列报告奇怪的间隔
- 从文本文件中读取时钟时间和事件时间并进行处理
- WMI检测进程创建事件-c++
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- 处理闪烁窗口事件
- C++Builder中的OnClick事件签名存在问题
- 跟踪滚动条上的鼠标事件
- 什么是事件表 (wxWidgets)?
- 如何在 MFCaptureEngine 中获取"Camera removed"事件
- 给定顺序中的事件处理
- 当服务中的事件被触发时,如何将响应从服务发送回客户端?
- 在 C++/CLI 中将 .NET 事件从一个 DLL 引发到另一个 DLL
- 如何创建事件驱动的 SDL2 应用程序
- Windows 进程间同步类似事件?
- 如何从C++端挂接到 QML 项的 onClick 事件
- 如何通过多类"Union variable" (sfml) 使用轮询事件
- 如何在Qt 4.8中阻止/忽略/丢弃早于特定超时的用户输入事件
- C++ 信号和插槽不工作:插槽不响应事件
- 在虚幻引擎中触发C++ dll的事件
- 具有Qt事件循环的可移植通用共享库设置