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