I have a solution in visual studio 2010 that contains 2 projects, one is a C# console application, which I will refer to as Foo, and the other is a CLR C++ console application, which I will refer to as Bar. Bar is an exe not a dll. When the Debug session starts is starts by running Foo. Foo starts Bar’s Process by using the code
System.Diagnostics.Process procBar = System.Diagnostics.Process.Start(pathToBarEXE)
I want to then attach that Bar.exe to the currently running debugger programmatically. I have a function that is supposed to do it (seen it everywhere on the internet)
public void AttachToProcess(int processId)
{
foreach (EnvDTE.Process process in DTE.Debugger.LocalProcesses)
{
if (process.ProcessID == processId)
{
process.Attach();
DTE.Debugger.CurrentProcess = process;
}
}
}
but the function does not compile, as DTE is an interface. I have modified the function thusly
public void AttachToProcess(int processId)
{
EnvDTE80.DTE2 dte2;
dte2 = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.10.0");
foreach (EnvDTE.Process process in dte2.Debugger.LocalProcesses)
{
if (process.ProcessID == processId)
{
process.Attach();
}
}
}
and it compiles and runs, but when it finds Bar’s process, the if statement throws the exception The message filter indicated that the application is busy. (Exception from HRESULT: 0x8001010A (RPC_E_SERVERCALL_RETRYLATER))
What am I doing wrong here?
They say here:
http://msdn.microsoft.com/en-us/library/ms228772.aspx
that it is because COM has some problems dealing with multithreaded applications. They are presenting a sample code, inviting you to use an IOleMessageFilter
to retry the call when you get rejected like this.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With