将代码从c#传递给c作为函数参数

问题描述:

我想从C#传递一个委托给C,如下所示。将代码从c#传递给c作为函数参数

// C#代码

Main() 
{ 
    //something 

    public delegate int watch(int BytesLeft, IntPtr response); 

    watch test1 = fun1; 

    SendImage(FileArray,Length,test1); 

    int fun1(int BytesLeft, IntPtr response) 
    { 
     //unmarshall response 
    } 
} 

C代码如下所示

// C代码

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 
} 

我怎样才能做到这一点?请帮忙。

您必须用与您的其他P/Invoke方法签名具有相同调用约定的UnmanagedFunctionPointerAttribute标记该委托。

C#然后自动处理函数指针的编组,的SendImage所述的P/Invoke签名是这样的(假设你委托类型是相同的例子,watch):

[DllImport(...)] 
public extern void SendImage(int data, int len, watch test); 

另外,您的代理类型声明如下所示:

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

不需要使用** Marshal.GetFunctionPointerForDelegate **? – SHRI 2012-03-26 07:59:24

+0

对不起,大部分时间我在做互操作时,函数指针是来回编组结构的一部分。事实证明你确实需要将它变成一个'IntPtr'并且调用'Marshal.GetFunctionPointerForDelegate'。我会为此更正答案。 – 2012-03-26 22:29:28

+0

不要修复它,pinvoke编组已经做到了。您的代码现在不能编译,无法传递IntPtr。 – 2012-03-26 23:50:06