Обработка исключений из неуправляемых DLL в C # - PullRequest
6 голосов
/ 18 мая 2010

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

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

<pre><code>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

<code>
[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 #, на самом деле не улавливает его. Зачем? Как обработать это исключение?
Спасибо за вашу помощь!

Ответы [ 4 ]

7 голосов
/ 26 апреля 2011

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

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

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

0 голосов
/ 18 мая 2010

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

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

0 голосов
/ 18 мая 2010

Проблема решена. Я обнаружил, что при использовании 4-го фреймворка у меня есть эта проблема, при использовании 3,5 - у меня нет.

0 голосов
/ 18 мая 2010

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

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

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

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

Возможно, причина в том, что он пытается записать в "результат", который помечен как только для ввода.

...