【发布时间】:2016-10-06 15:45:56
【问题描述】:
我们有一个 .NET 3.5 程序集 (dll) 由 VB6“代理”(exe) 通过 COM 接口执行。 VB6 代码确实调用了:
' Ensure that no system dialog comes up when we GPF.
PreviousErrorMode = SetErrorMode(SEM_NOGPFAULTERRORBOX)
SetErrorMode PreviousErrorMode Or SEM_NOGPFAULTERRORBOX
' Assign our Exception Handler for this process.
PreviousExceptionFilter = SetUnhandledExceptionFilter(AddressOf UnhandledExceptionFilter)
VB6 UnhandledExceptionFilter 将异常转换为 VB6 引发的错误。 (但这里也没有调用它,而且这个 VB6 代码多年来没有被更改——甚至没有重新编译。)
在 VB6 代码创建的第一个 .NET 对象的构造函数中,我向AppDomain.CurrentDomain.UnhandledException 添加了一个处理程序(并且,为了调试此问题,我为Windows.Forms.Application.ThreadException 添加了一个处理程序,但它没有没有帮助,不是说我们有任何由 .NET 显示的 UI)。
我确定在 VS2008 中开发此代码时,UnhandledException 事件已经捕获了一些东西,但我不确定我在 VS2015 中是否见过它。
代码运行多个线程,其中一些执行主要目的,包括插入和更新 SQL Server 数据,还通过 TCP 协议进行通信,该协议由其他线程处理,包括 BackgroundWorker。
执行主要目的的人是通过以下方式创建的:
taskThread = New Thread(AddressOf EnsureTaskCompletes)
taskThread.SetApartmentState(Threading.ApartmentState.STA)
taskThread.Start()
它太专有和复杂,无法向您展示更多代码,但我在调试此问题时已将代码调整为简单的Throw New Exception,而不是最终具有相同效果的复杂代码。(*)
UnhandledExceptionHandler 没有处理这个“简单”异常,除非我打开了非托管调试,否则它只会静默终止程序。
当 .NET Framework “仅”作为 dll 加载时,AppDomain.CurrentDomain.UnhandledException 的行为是否有记录更改?
(由于 COM 重新注册,我不想在 VS2008 中构建以前的版本,但尚未确认 是否有行为更改。我已经确认了 . NET 3.5 Exe 由 VS2015 编译,它创建一个抛出未处理异常的 Thread确实 处理 UnhandledException 事件中的异常。)
对我来说,解决方法是将Catch 添加到EnusreTaskCompletes 中的现有Try Finally 中,该EnusreTaskCompletes 已经尝试至少记录线程在任务完成之前已终止,然后我自己调用UnhandledExceptionHandler。
(*实际的问题是数据库中缺少一个表,该表仅在您用尽信用时使用-我没有添加该代码或表。这引发了一个未被捕获的异常UnhandledExceptionHandler,调试起来相当困难——SQL Server Profiler 终于找到了问题。)
【问题讨论】:
-
我想我可能不得不reset my Visual Studio settings,因为现在我没有任何断点或
Debugger.Break,除非我在detach (and reattach) the processDebugger.Launch 上工作。但我会先尝试重新启动。
标签: .net multithreading vb6 unhandled-exception