我有一个访问 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 任务窗格中。