C# 在C中处理来自非托管dll的异常# [DllImport("Padeg.dll", EntryPoint = "GetNominativePadeg")] private static extern Int32 decGetNominativePadeg(IntPtr surnameNamePatronimic, **ref** IntPtr result, ref Int32 resultLength);

C# 在C中处理来自非托管dll的异常# [DllImport("Padeg.dll", EntryPoint = "GetNominativePadeg")] private static extern Int32 decGetNominativePadeg(IntPtr surnameNamePatronimic, **ref** IntPtr result, ref Int32 resultLength);,c#,dll,unmanaged,C#,Dll,Unmanaged,我用C编写了以下函数# public static string GetNominativeDeclension(string surnameNamePatronimic) { if(surnameNamePatronimic == null) throw new ArgumentNullException("surnameNamePatronimic"); IntPtr[] ptrs = null; try { ptrs = StringsToIntPtrAr

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

函数decketNagnativePadeg位于非托管dll中
[DllImport("Padeg.dll", EntryPoint = "GetNominativePadeg")]
private static extern Int32 decGetNominativePadeg(IntPtr surnameNamePatronimic,
    **ref** IntPtr result, ref Int32 resultLength);

[DllImport(“Padeg.dll”,EntryPoint=“getnamignivepadeg”)]
私有静态外部程序Int32 DeggetNamePadeg(IntPtr姓氏用户,
IntPtr结果,参考Int32结果长度);

并抛出一个异常:
尝试读取或写入受保护内存。这通常表示其他内存已损坏

C代码中的捕获实际上并不捕获它。为什么?如何处理此异常?

谢谢你的帮助

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

在通过之前,我没有看到
ptrs[1]
被分配任何值

尝试将定义更改为:


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

您可能已关闭非托管代码的调试

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

“CLR不再向托管代码中的异常处理程序传递损坏进程状态的异常。”

只需将其添加到配置文件:

它由StringsToIntPtraray函数指定,但DeGet。。。方法之前已调用!因此,可能在finally子句中提出了例外,这就是为什么它没有被捕获?尝试注释掉FreeIntPtr(ptrs);然后看看会发生什么?调试器说它在DecGetNaminativePadeg中。可以使用
HandleProcessCorruptedStateExceptions