C# 在C中处理来自非托管dll的异常# [DllImport("Padeg.dll", EntryPoint = "GetNominativePadeg")] private static extern Int32 decGetNominativePadeg(IntPtr surnameNamePatronimic, **ref** IntPtr result, ref Int32 resultLength);
我用C编写了以下函数#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
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