Обрабатывание исключения от неуправляемого dll в C#

У меня есть следующая функция, записанная в C#

public static string GetNominativeDeclension(string surnameNamePatronimic)
{
    if(surnameNamePatronimic == null) 
       throw new ArgumentNullException("surnameNamePatronimic");

IntPtr[] ptrs = null;
try
{
    ptrs = StringsToIntPtrArray(surnameNamePatronimic);

    int resultLen = MaxResultBufSize;
    int err = decGetNominativePadeg(ptrs[0], ptrs[1], ref resultLen);
    ThrowException(err);
    return IntPtrToString(ptrs, resultLen);
}
catch
{
    return surnameNamePatronimic;
}
finally
{
    FreeIntPtr(ptrs);
}

}

Функция decGetNominativePadeg находится в неуправляемом dll


[DllImport("Padeg.dll", EntryPoint = "GetNominativePadeg")]
private static extern Int32 decGetNominativePadeg(IntPtr surnameNamePatronimic,
    IntPtr result, ref Int32 resultLength);

и выдает исключение: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
Выгода, которая находится в коде C#, на самом деле не ловит его. Почему? Как обработать это исключение?
Спасибо за помощь!

6
задан StuffHappens 18 May 2010 в 06:22
поделиться

3 ответа

вы, вероятно, отключили отладку неуправляемого кода.

«Включить параметр отладки неуправляемого кода» необходимо проверить в свойствах проекта в разделе «Отладка». После этого исключение отображается в процессе отладки.

-1
ответ дан 17 December 2019 в 07:01
поделиться

Проблема решена. Выяснил, что при использовании 4-го фреймворка такая проблема возникает, при использовании 3.5 - нет.

-2
ответ дан 17 December 2019 в 07:01
поделиться

Если параметр IntPtr result должен получить значение из функции, он должен быть помечен как ref.

Я не вижу, чтобы ptrs [1] было присвоено какое-либо значение перед передачей.

Попробуйте изменить определение на:

[DllImport("Padeg.dll", EntryPoint = "GetNominativePadeg")]
private static extern Int32 decGetNominativePadeg(IntPtr surnameNamePatronimic,
    **ref** IntPtr result, ref Int32 resultLength);

Причина, вероятно, в том, что он пытается записать в «результат», который помечен как предназначенный только для ввода.

0
ответ дан 17 December 2019 в 07:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: