marshal委托给函数指针:内存损坏

时间:2012-03-30 10:04:37

标签: c visual-studio-2010 visual-c++ c#-4.0

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);
}

1 个答案:

答案 0 :(得分:4)

当垃圾收集器运行并删除委托实例时,您的程序将会崩溃。曾经被pfWatch局部变量引用的那个。但是,当ReadImageFile()返回时,该变量很快就消失了。收集器无法查看非托管代码所持有的引用。

您必须自己保留一个引用并将其存储在收集器可以看到的位置。 pfWatch必须至少是您的类中的字段而不是本地变量。可能是静态的,所以它永远不会被垃圾收集。当本机代码停止进行回调时,您的代码段无法清楚。