2012-03-30 56 views
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

你为什么标签这个问题''C'视觉C++'和'C#-4.0' – Eregrith 2012-03-30 12:46:09

回答

4

当垃圾收集器运行并删除委托实例时,您的程序将崩溃。曾经被你的pfWatch局部变量引用的那个。但没有更多,该变量早已消失,ReadImageFile()返回时跳过。收集器不能看到非托管代码持有的引用。

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

+0

从C++/CLI中,你可以使用'gcroot'模板,以保持基准活着。我建议编写一个C++/CLI包装器,它可以编组委托,然后从C#调用代码,就好像它是纯.NET一样。 – 2012-03-31 12:46:43

+0

谢谢分配:) – SHRI 2012-04-02 04:37:15