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

时间:2010-05-18 06:22:40

标签: c# dll unmanaged

我用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中

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

并抛出异常: [DllImport("Padeg.dll", EntryPoint = "GetNominativePadeg")] private static extern Int32 decGetNominativePadeg(IntPtr surnameNamePatronimic, IntPtr result, ref Int32 resultLength);
C#代码中的catch实际上并没有捕获它。为什么?如何处理这个例外?
谢谢你的帮助!

4 个答案:

答案 0 :(得分:7)

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

.NET Framework 4 Migration Issues

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

答案 1 :(得分:0)

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

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

尝试将定义更改为:

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

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

答案 2 :(得分:-1)

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

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

答案 3 :(得分:-2)

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