2012-03-26 18 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コードは、私がこれをどのように行うことができます

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 
} 

// Cコードの下に示されていますか?助けてください。

答えて

0

UnmanagedFunctionPointerAttributeで代理人を他のP/Invokeメソッドのシグネチャと同じ呼び出し規約でマークする必要があります。

C#は自動的に関数ポインタのマーシャリングを処理し、SendImageのP /呼び出し署名は(、デリゲート型はあなたの例と同じである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

+0

申し訳ありませんが、私がinteropをやっているとき、ほとんどの場合、関数ポインタは前後にマーシャルされる構造体の一部です。実際には 'IntPtr'を作成し、' Marshal.GetFunctionPointerForDelegate'を呼び出す必要があることが分かります。私はその答えを修正します。 –

+0

それを修正しないでください、pinvoke marshallerは既にそれを行います。あなたのコードはコンパイルされず、IntPtrを渡すことはできません。 –

関連する問題