2012-03-26 183 views
1

我想從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 
} 

我怎樣才能做到這一點?請幫忙。

回答

0

您必須用與您的其他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

相關問題