【问题标题】:Gracefully handle an unmanaged DLL crash on Managed side that is accessed via P/Invoke [DllImport]优雅地处理通过 P/Invoke [DllImport] 访问的托管端的非托管 DLL 崩溃
【发布时间】:2016-03-15 11:24:33
【问题描述】:

我有一个 C# 应用程序,它引用了一个 CLI/C++ 程序集,该程序集通过标头中的一些外部“C”方法([DllImport] 属性)与非托管 dll 进行互操作。

一切都很好,即使不是有点复杂。 所有这些都存在于其中的项目围绕这个最终的非托管 DLL 进行测试,因此它的稳定性是不确定的。

当非托管 DLL 崩溃时,上面的当前系统有什么方法可以不关闭 C# 和 cli/C++ 程序集?我不相信有,因为内存空间太庞大了,但谢天谢地,SO 在很多情况下证明我错了。

【问题讨论】:

  • 非托管 DLL 的约定是,如果传递了有效的输入,它永远不会抛出异常。您应该确保 DLL 遵守合同。
  • 因为这个项目是为了测试目的(通过与被测产品交互)——我不能依赖任何这样的合同,这个软件本质上是在验证合同。此外,AUT 是 C/C++ 代码,因此并未真正使用异常。不一定会传入有效的输入,这是一个测试基础设施,崩溃只会破坏整个过程 - 无论我包装调用多少次尝试/捕获。

标签: c# interop pinvoke unmanaged managed-c++


【解决方案1】:

我最终拥有了一个完全独立的进程的看门狗应用程序。这会启动可能被坏 dll 删除的应用程序,并且由于它具有进程句柄,因此它可以尝试各种方法来检测崩溃或关闭。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    相关资源
    最近更新 更多