P/Invoke - 封送委托作为函数指针+ void*

geo*_*f_h 5 c# pinvoke

C中一个相当普遍的习惯用于采用多态闭包的函数将其表示为两个参数,一个函数指针和一个void指针(它作为函数指针的一个参数传递).

GPGME库中获取的示例:

typedef gpgme_error_t (*gpgme_passphrase_cb_t) (void *hook,
                                                const char *uid_hint,
                                                const char *passphrase_info,
                                                int prev_was_bad, 
                                                int fd);

void gpgme_set_passphrase_cb (gpgme_ctx_t ctx,
                              gpgme_passphrase_cb_t cb, 
                              void *hook_value);
Run Code Online (Sandbox Code Playgroud)

从概念上讲,函数指针加上void指针代表与C#(一个闭包)中的委托相同的东西.在进行这种P/Invoke调用时,是否有一种很好的,规范的方法来编组代理?

Dav*_*nan 2

在进行此类 P/Invoke 调用时,是否有一种好的、规范的方式来编组委托?

您不需要使用void*参数,因为 C# 委托是一个闭包。IntPtr.Zero作为钩子值传递。您的 C# 委托仍然需要接受该void*参数,但它可以简单地忽略它,因为它不需要它。