【发布时间】:2013-08-07 08:25:51
【问题描述】:
我在编写的 SharpDX 程序中遇到了一个奇怪的错误。
该程序包含一个表单MainForm,它继承自SharpDX.Windows.RenderForm(我正在做Direct3D 9)。我有一些逻辑可以通过调用MainForm.Close() 来杀死程序,并且它运行良好。
但是,当我使用 X 按钮或双击屏幕左上角关闭表单时,程序以代码 -1073610751 (0xc0020001) 结束。
这是一个相对较小的烦恼,因为它只在程序完成时发生,所以它是否因错误退出并不重要,因为它实际上正在完成。
但是,当我在Main() 的最后一行设置断点时,不会发生此错误。如果我这样做了,然后按照我的解释关闭窗口,断点就会被命中,然后继续以代码 0 结束程序。
除了 SharpDX 和一个纯 C DLL 我调用一次性处理一些数据,我没有做混合代码,或任何其他奇怪的东西。
我环顾四周,但这段代码似乎与字符串绑定有关?其他人在做奇怪的混合 C++/CLI 的东西时似乎有这个问题,但我没有做这样的事情。
有什么想法吗?至少关于如何获得有关此错误代码的更简洁信息?
【问题讨论】:
-
检查此链接...blogs.msdn.com/b/cbrumme/archive/2003/04/15/51318.aspx - 从您的描述看来,可能设置了一些消息处理(或从 COM 到您的程序的其他回调),它回调您的 - 或 SharpDX 的 -托管方法并且没有(及时)清理。如果这些回调在托管运行时关闭后发生,您将收到该错误。如果该理论成立,则在最后一行 出现 放置一个断点以留出时间进行清理。
-
也许您应该调试代码,如果这是第 3 方 .DLL,也许您需要对手动创建的对象进行
Dispose的一些代码的调试。到目前为止,您尝试过什么..? -
@MatthewWatson:我不这么认为,因为正如我所说,我没有使用混合程序集。除非 SharpDX 正在做混合的东西,但这不太可能。
-
这可能是 SharpDX 本身的问题 - 或者可能是 SharpDX 试图(或失败)清理你在最后一刻没有清理的东西 - 例如,就像@DJKRAZE 所说,你需要
Dispose的东西,或者你需要分离的事件处理程序。我很确定错误代码在所有情况下都是相同的(在这种情况下) - 字符串绑定错误和我链接的错误代码都涉及在运行时开始关闭后从 COM(或非托管代码)调用托管代码下。 SharpDX 确实是纯托管代码,但调用(并被调用)COM。