我用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实际上并没有捕获它。为什么?如何处理这个例外?
谢谢你的帮助!
答案 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时 - 我没有。