public class SendImage
{
public delegate int DWatch(int bytesLeftToSend, IntPtr Response);
ret=0xffff;
public void ReadImageFile()
{
int len = 1495;
DWatch pfWatch = DResponse;
IntPtr pfMethod = Marshal.GetFunctionPointerForDelegate(pfWatch);
ret=Send(len, pfMethod);
}
public int DResponse(int bytesLeftToSend, IntPtr Response)
{
//something;
return 0;
}
}
上面的代码显示了委托到函数指针的编组方式。从此,我能够回调。但后来我得到了内存损坏的错误。请帮忙。感谢
//unmanaged call in code
int Send(int length, int(*pfMethod)(int bytesLeftToSend, void * Response))
{
int Remaining = 50;
pfMethod(50);
}
答案 0 :(得分:4)
当垃圾收集器运行并删除委托实例时,您的程序将会崩溃。曾经被pfWatch局部变量引用的那个。但是,当ReadImageFile()返回时,该变量很快就消失了。收集器无法查看非托管代码所持有的引用。
您必须自己保留一个引用并将其存储在收集器可以看到的位置。 pfWatch必须至少是您的类中的字段而不是本地变量。可能是静态的,所以它永远不会被垃圾收集。当本机代码停止进行回调时,您的代码段无法清楚。