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コードの下に示されていますか?助けてください。
** Marshal.GetFunctionPointerForDelegate **を使用する必要はありませんか? – SHRI
申し訳ありませんが、私がinteropをやっているとき、ほとんどの場合、関数ポインタは前後にマーシャルされる構造体の一部です。実際には 'IntPtr'を作成し、' Marshal.GetFunctionPointerForDelegate'を呼び出す必要があることが分かります。私はその答えを修正します。 –
それを修正しないでください、pinvoke marshallerは既にそれを行います。あなたのコードはコンパイルされず、IntPtrを渡すことはできません。 –