带有数据的 mono_add_internal_call

Posted

技术标签:

【中文标题】带有数据的 mono_add_internal_call【英文标题】:mono_add_internal_call with data 【发布时间】:2014-07-03 11:42:30 【问题描述】:

我正在尝试向单声道添加内部调用,如下所示:

void addCall(char *name, char *amx_name)

    AMX_NATIVE native = sampgdk::FindNative(name);

    void(*natcall)() = []()
    
        //Can't access native here... :(
        callNative(native);
    ;
    mono_add_internal_call(name, (void *)natcall);

内部调用应该调用带有一些数据的方法(指向本机的指针,AMX_NATIVE)。但是,无法在 lambda 代码中访问该值。

当您使用变量捕获 ( [&]() ... ) 时,无法将 lambda 代码转换为 void *,我需要调用 mono_add_internal_call。

有人能想办法解决这个问题吗?

【问题讨论】:

【参考方案1】:

为什么不让 FindNative 返回函数指针并将其传递给 mono_add_internal_call?为什么需要 callNative 函数?我不能说不知道那个 3rd 方库。

可以这样想:函数指针是编译代码的地址。具有捕获功能的 lamda 不是静态的。这样的函数指针需要知道在哪里可以找到它所期望的“本机”变量。

您是否提前知道需要添加的所有功能?如果是这样,为什么不允许您的内部调用有一个带有本机方法索引的枚举参数?不过,这并不比手动导出它们好多少。

【讨论】:

对于 FindNative 是一个来自外部库的函数。 addCall 的目的是动态添加对 sampgdk 库提供的“本机”函数的内部调用。自从我问过这个问题以来,我通过处理 C# 中“本机”函数名称的传递来解决这个问题。我添加了一个类似于call_native_array(MonoString *name_string, MonoString *format_string, MonoArray *args_array) 的内部调用,它处理对“本机”函数的所有调用。

以上是关于带有数据的 mono_add_internal_call的主要内容,如果未能解决你的问题,请参考以下文章

使用查询公式将带有分隔符的列数据和带有其他分隔符的行数据连接起来

带有核心数据的 NSPredicate,在字符串属性中搜索带有边界的单词

带有数据定义的火花数据框架架构

带有和不带有数据的 DataGridView 中的按键修饰符

使用带有数据数组的 Yii2 和带有排序和过滤的 Gridview

将带有 start - end 的行转换为带有 TimeIndex 的数据帧的性能问题