маршал делегат функции указатель: память повреждена - PullRequest
0 голосов
/ 30 марта 2012
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 Ответ

4 голосов
/ 30 марта 2012

Ваша программа упадет при запуске сборщика мусора и удалит экземпляр делегата.Тот, на который когда-то ссылалась ваша локальная переменная pfWatch.Но не более того, эта переменная давно исчезла, выгружается при возврате ReadImageFile ().Сборщик не может видеть ссылки, удерживаемые неуправляемым кодом.

Вы должны хранить ссылку самостоятельно и хранить ее в месте, которое может увидеть сборщик.По крайней мере, pfWatch должен быть полем в вашем классе, а не локальной переменной.Возможно статический, поэтому он никогда не будет собирать мусор.Из вашего фрагмента не ясно, когда нативный код перестает делать обратные вызовы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...