在C#中处理来自非托管dll的exception

我有用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); } } 

 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); } } 

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); 

并抛出exception: Attempted to read or write protected memory. This is often an indication that other memory is corrupt Attempted to read or write protected memory. This is often an indication that other memory is corrupt
C#代码中的catch实际上并没有捕获它。 为什么? 如何处理此exception?
谢谢您的帮助!

“CLR不再为托管代码中的exception处理程序提供损坏的进程状态的exception。”

.NET Framework 4迁移问题 。

只需将其添加到配置文件: http : //msdn.microsoft.com/en-us/library/dd638517.aspx

如果IntPtr result参数是从函数中接收值,则必须将其标记为ref。

我没有看到ptrs[1]在传递之前被赋予任何值。

尝试将定义更改为:

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

原因可能是它试图写入“结果”,标记为仅输入。

你可能已经关闭了非托管代码的调试。

“启用非托管代码调试选项”必须在“调试”部分下检查项目属性。 在此之后,调试过程中会显示exception。

问题解决了。 我发现当使用第4个框架时我有这个问题,当使用3.5时 – 我没有。