c# - 程序已退出,代码为 -1073610751 (0xc0020001)

标签 c# sharpdx

我在我制作的 SharpDX 程序中遇到了一个奇怪的错误。

该程序包含一种形式MainForm,它继承自SharpDX.Windows.RenderForm(我正在做Direct3D 9)。我有一些逻辑可以通过调用 MainForm.Close() 终止程序,并且它运行良好。

但是,当我使用 X 按钮或双击屏幕左上角关闭表单时,程序以代码 -1073610751 (0xc0020001) 结束。

这是一个相对较小的烦恼,因为它只在程序结束时发生,所以它是否因错误退出并不重要,因为它实际上正在结束。

但是,当我在 Main() 的最后一行设置断点时,不会发生此错误。如果我这样做,然后按照我的解释关闭窗口,断点就会命中,然后继续以代码 0 结束程序。

除了 SharpDX 和一个纯 C DLL 之外,我正在调用一次性处理一些数据,我没有做混合代码或任何其他奇怪的事情。

我环顾四周,但这段代码似乎与字符串绑定(bind)有关?其他人在做奇怪的混合 C++/CLI 事情时似乎有这个问题,但我没有做那样的事情。

有什么想法吗?至少关于如何获得有关此错误代码的更简明信息?

最佳答案

这是一个非常低级的 RPC 错误。这很可能在您的程序中使用,它是 COM 在其上运行的基础协议(protocol)。有很多候选者,SharpDX 本身使用 COM 互操作层来进行 DirectX 调用。并且 DirectX 本身很可能对您的视频驱动程序进行此类调用。

这也是您希望在出现关机顺序问题时触发的错误代码。就像在发布后使​​用 COM 接口(interface)一样。干净地关闭程序可能是一个很难解决的问题,尤其是当有很多线程时。任何 DirectX 应用程序中都有。忽略这样的问题也很容易,即使它是已知的并且记录在某人的错误数据库中。因为,正如您所指出的,该程序可以正常关闭,没有任何令人讨厌的异常。 RPC 已经阻止它爆炸,您看到它生成的错误代码。

对于这个问题,您自己无能为力,这是您没有编写的代码,您永远找不到编写的程序员。如果您在输出窗口中看到第一次机会异常通知,那么您可以启用非托管调试器,使用 Debug + Exceptions 并勾选 Win32 异常的 Thrown 复选框,启用 Microsoft Symbol 服务器,您将在异常时获得堆栈跟踪被抛出。请注意,这将在 native 代码的内部,没有源代码可供查看。但它可以查明导致问题的 DLL。您仍然无法修复该 DLL。我建议更新视频驱动程序,这是最常见的问题来源。这是你能接受的范围。

关于c# - 程序已退出,代码为 -1073610751 (0xc0020001),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18098331/

相关文章:

windows-8.1 - 在通用应用程序共享项目中包含 .targets 文件以包含自定义构建操作

directx - IDXGIFactory::EnumAdapters() 不返回任何适配器

c# - WPF 中的 SharpDX 渲染

c# - 解决方案第一次构建 w/missing auto-generated .g.cs 文件失败,第二次构建成功

c# - 向事件处理函数发送额外的字符串

C# 写入 linq 查询中的文件

c# - 我的单层感知器不工作

memory-leaks - 从 Process Explorer 解释 GPU 信息

c# - 缺少 SharpDX.Windows?

c# - 如何以编程方式调用设置魅力?