0

我有一个访问 Excel 应用程序对象的简单过程。它订阅一个事件,然后将调试器附加到自身。

该应用程序的整个源代码如下:

void Main()
{
    var excel = (Application)Marshal.GetActiveObject("Excel.Application");

    // if any event has a subscription, attaching the debugger
    // freezes the message loop in Excel while the debugger is paused 
    excel.WorkbookNewChart += (a,b) => {};

    Debugger.Launch();
}

当调试器(例如 Visual Studio)启动时,它会冻结(所有线程)我的控制台应用程序。

我觉得令人费解的是,这也阻止了 Excel 中的消息循环,使 Excel 无响应。但是,Excel 中的消息循环仅在我订阅某些事件时才会被阻止,例如 WorkbookNewChart。哪个事件无关紧要,事件是否被触发也无关紧要。

我的问题是:

  • 为什么将调试器附加到此控制台应用程序会冻结 Excel 的消息循环,我可以做些什么来阻止它?
  • 我只是将 Excel 的行为视为一个黑匣子 - 是否有任何工具可以用来找出可能阻止 Excel 进程中的消息泵的原因?

Loaded[更新:在 WPF 窗口的事件处理程序中运行相同的三行代码具有相同的结果。]


背景- 为什么我对此感兴趣:

我正在 Excel 中制作一个可用于构建小型应用程序的 IDE。这些应用程序在自己的进程中运行,但通过Marshal.GetActiveObject. 我的 IDE 是一个在 Excel 进程中运行的 Excel 插件。我希望我的 IDE 能够调试我从 IDE 生成的运行器进程。启动应用程序时似乎一切正常,但在上述情况下我陷入僵局,调试器冻结运行器进程,然后阻止 excel 进程,这使我无法使用调试器。

调试器的屏幕截图

当然,我可以在另一个单独的进程中运行我的调试器/IDE,但从用户体验的角度来看,如果可能的话,我希望将其保留在 Excel 任务窗格中。

4

0 回答 0