将委托作为函数参数从c#传递到c

将委托作为函数参数从c#传递到c,c#,visual-c++,C#,Visual C++,我想从C#向C传递一个委托,如下所示 //C#代码 C代码如下所示 //C代码 SendImage(整数数据、整数长度、测试) { //某物 无符号字符ptr[10]; ptrByte=&ptr[0]; //某物 对于(i=0;i您必须使用与其他p/Invoke方法签名相同的调用约定来标记委托 C#然后自动处理函数指针的编组,SendImage的p/Invoke签名如下所示(假设您的委托类型与示例中的相同,watch): 此外,您的委托类型声明如下所示: [UnmanagedFunctionPo

我想从C#向C传递一个委托,如下所示

//C#代码

C代码如下所示

//C代码

SendImage(整数数据、整数长度、测试)
{
//某物
无符号字符ptr[10];
ptrByte=&ptr[0];
//某物

对于(i=0;i您必须使用与其他p/Invoke方法签名相同的调用约定来标记委托

C#然后自动处理函数指针的编组,
SendImage
的p/Invoke签名如下所示(假设您的委托类型与示例中的相同,
watch
):

此外,您的委托类型声明如下所示:

[UnmanagedFunctionPointer(...)]
public delegate int watch(int BytesLeft, byte response);

不需要使用Marshal.GetFunctionPointerForDelegate?很抱歉,在我进行互操作时,大多数情况下函数指针都是结构的一部分,可以来回进行封送处理。事实证明,您确实需要将其设置为
IntPtr
并调用
Marshal.GetFunctionPointerForDelegate
。我会更正答案。不要修复它,pinvoke marshaller已经这样做了。您的代码现在无法编译,无法传递IntPtr。将其还原,我不在家,无法轻松测试我的代码。
SendImage(int data, int len, <function_ptr>test)
{
    //something
    unsigned char ptr[10];
    ptrByte = &ptr[0];
    //something
    for(i=0;i<num_of_packet,i++)
    {
        TLayer();//something:some call
        int check=0;
        check = test(bytes_left, ptrByte);
    }
    //something
}
[DllImport(...)]
public extern void SendImage(int data, int len, watch test);
[UnmanagedFunctionPointer(...)]
public delegate int watch(int BytesLeft, byte response);