使用.NET以编程方式将第二个进程附加到VS2010

kur*_*ure 7 .net c# c++ debugging visual-studio-2010

我在visual studio 2010中有一个包含2个项目的解决方案,一个是C#控制台应用程序,我将其称为Foo,另一个是CLR C++控制台应用程序,我将其称为Bar.Bar是exe而不是dll.当调试会话启动时,通过运行Foo启动.Foo通过使用System.Diagnostics.Process procBar = System.Diagnostics.Process.Start(pathToBarEXE) 我想要的代码启动Bar的进程, 然后以编程方式将Bar.exe附加到当前运行的调试.我有一个应该这样做的功能(在互联网上随处可见)

public void AttachToProcess(int processId)
    {
        foreach (EnvDTE.Process process in DTE.Debugger.LocalProcesses)
        {
            if (process.ProcessID == processId)
            {
                process.Attach();
                DTE.Debugger.CurrentProcess = process;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是函数没有编译,因为DTE是一个接口.我已经修改了这个功能

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();
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

它编译并运行,但是当它找到Bar的进程时,if语句抛出异常The message filter indicated that the application is busy. (Exception from HRESULT: 0x8001010A (RPC_E_SERVERCALL_RETRYLATER))我在这里做错了什么?

Lau*_*ZZA 1

他们在这里说:

http://msdn.microsoft.com/en-us/library/ms228772.aspx

这是因为 COM 在处理多线程应用程序时存在一些问题。IOleMessageFilter他们提供了一个示例代码,邀请您在像这样被拒绝时使用重试呼叫。