Обработка на изключение от неуправляван 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