将代码从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);
不需要使用** Marshal.GetFunctionPointerForDelegate **? – SHRI 2012-03-26 07:59:24
对不起,大部分时间我在做互操作时,函数指针是来回编组结构的一部分。事实证明你确实需要将它变成一个'IntPtr'并且调用'Marshal.GetFunctionPointerForDelegate'。我会为此更正答案。 – 2012-03-26 22:29:28
不要修复它,pinvoke编组已经做到了。您的代码现在不能编译,无法传递IntPtr。 – 2012-03-26 23:50:06