Debugging a (marshalled) RCW proxy blocks the message loop on the COM server - why?

54 Views Asked by At

I have a simple process that accesses the Excel application object. It subscribes to an event and then attaches a debugger to itself.

The entire source code of the app is as follows:

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();
}

When the debugger (e.g. Visual Studio) starts, it freezes (all the threads in) my console app.

What I find puzzling is, this also blocks the message loop in Excel, making Excel unresponsive. However, the message loop in Excel is only blocked if I subscribe to some event, e.g. WorkbookNewChart. It doesn't matter which event and it doesn't matter if the event is fired or not.

My questions are:

  • Why might attaching the debugger to this console app freeze Excel's message loop and is there something I can do prevent it?
  • I'm only seeing the behavior of Excel as a black box - are there any tools I could use to figure out what might be blocking the message pump in the Excel process?

[Update: running the same three lines of code in a WPF window's Loaded event handler has the same outcome.]


Background - why I'm interested in this:

I'm making an IDE inside Excel which can be used to build small apps. These apps run in their own processes but access Excel via Marshal.GetActiveObject. My IDE is an Excel add-in running inside the Excel process. I'd like my IDE to be able to debug the runner processes that I spawn from the IDE. Things seem to work ok when starting the apps, but I get deadlocked in situations like the one above, where the debugger freezes the runner process which then blocks the excel process, which makes me unable to use the debugger.

Screenshot of the debugger

I can, of course, run my debugger/IDE in another separate process, but from a user experience perspective I'd love to keep it inside the Excel task pane if possible.

0

There are 0 best solutions below