Visual Studio:调试停止时执行清理代码

10
我们开发了一个应用程序,它使用Excel互操作库(Microsoft.Office.Interop.Excel)来读取一些Excel文件。
当应用程序出现问题时,会处理事件Application.ThreadException,以释放资源(关闭Excel等)。
问题是,当我们使用VS调试器停止执行(因为进程在异常、断点处中断等原因),资源不会被释放,Excel仍然保持打开状态。当然,下次启动应用程序时...它会崩溃,因为文件被锁定。
所以我正在寻找一种方法来强制释放Excel对象,即使在调试器中停止时也能够释放。
有什么建议吗?
3个回答

16

您可以使用DTE(VisualStudio Automation Model)编写一个宏,该宏将在停止调试发生时调用。下面是一个想法片段。

Private Sub DebuggerEvents_OnEnterBreakMode(
   ByVal Reason As EnvDTE.dbgEventReason, 
   ByRef ExecutionAction As EnvDTE.dbgExecutionAction) Handles DebuggerEvents.OnEnterBreakMode
    If (Reason = dbgEventReason.dbgEventReasonStopDebugging) Then
        // DO YOUR CLEAN UP CODE HERE
    End If
End Sub

3
很遗憾,VS 2012+ 中没有宏。 - roufamatic

1
很不幸,没有办法做到这一点。在Visual Studio中,停止按钮会终止进程,所以它没有机会进行清理。
作为一个可能的解决方法(虽然不是太好),您可以编写一个清理例程,并在停止应用程序之前从即时窗口手动执行它。
[编辑:忽略我。这个答案是错误的。Shay Erlichmen提出了一个更好的使用宏的解决方案]

0

一种可能性是切换到纯 .NET 解决方案,例如 SpreadsheetGear for .NET,以摆脱与 COM 互操作相关的性能和可靠性问题。

免责声明:我拥有 SpreadsheetGear LLC


虽然我们只需要读取一个Excel文件,但使用这个解决方案有点贵。 我研究了一些开源解决方案(例如Koogra http://koogra.sourceforge.net/),但它无法处理我们的XLS文件。 - Julien N

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接