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

I have the following function written in 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# на самом деле его не перехватывает. Почему? Как обработать это исключение?
Спасибо за помощь!


person StuffHappens    schedule 18.05.2010    source источник
comment
Так может быть, исключение возникает в предложении finally и поэтому оно не перехватывается? Попробуйте закомментировать FreeIntPtr(ptrs); и посмотреть, что происходит?   -  person Wodzu    schedule 18.05.2010
comment
Отладчик говорит, что он находится в decGetNominativePadeg.   -  person StuffHappens    schedule 18.05.2010


Ответы (3)


«CLR больше не доставляет исключения для поврежденного состояния процесса в обработчики исключений в управляемом коде».

Проблемы миграции на .NET Framework 4.

Просто добавьте это в файл конфигурации: http://msdn.microsoft.com/en-us/library/dd638517.aspx

person David MC Coelho    schedule 26.04.2011

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

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

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

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

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

person Gaurav Vaish    schedule 18.05.2010
comment
Задается функцией StringsToIntPtrArray. - person StuffHappens; 18.05.2010
comment
Но перед этим вызывается метод decGet...! - person Gaurav Vaish; 19.05.2010

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

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

person Wodzu    schedule 18.05.2010
comment
Можно использовать HandleProcessCorruptedStateExceptions - person lindexi; 13.10.2017