我正在使用非托管dll与抛出std::exception
的函数。在.NET中捕获非托管dll异常
我正在使用.NET DLL封装器,因此它可以分发到.NET程序中使用。
我希望能够捕获从机异常的消息,但所有我得到的是System.Runtime.InteropServices.SEHException("External component has thrown an exception.")
有什么办法来传播异常的详细信息?也许我应该从本机DLL导出自定义异常?我将如何做到这一点?
感谢
机DLL:
__declspec(dllexport) void __stdcall W32DLLFunc(int param) {
if (param < 0) {
throw new exception("Error: param must be > 0");
}
...
}
.NET的DLL:
[DllImport("nw32.dll", CharSet = CharSet::Auto)]
static void W32DLLFunc(int param);
vb.net程序:
Try
W32DLLFunc(-1)
Catch ex As Exception
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
的确如此,着名的'E msc'异常。我会删除我的评论以换取积分。您仍然可以添加关于编写C++/CLI包装器的说明,将C++异常转换为.NET异常,这似乎是最干净的解决方案。混合模式程序集甚至可以被本机代码和托管代码使用。 – IInspectable
干杯。一个C++/CLI包装器发生在我身上,但我不知道本机异常如何与C++/CLR交互。 [这篇文章](http://msdn.microsoft.com/en-us/library/df24ysb6.aspx)几乎意味着它可以工作,所以我给它一个去,它确实。我已经更新了我的答案。 – arx