2013-05-16 51 views
7

我在Visual Studio 2010中有一个包含2个项目的解决方案,一个是C#控制台应用程序,我将其称为Foo,另一个是CLR C++控制台应用程序,我将其称为Bar。酒吧是一个exe不是一个dll。当调试会话启动时,通过运行Foo启动。 Foo通过使用代码 System.Diagnostics.Process procBar = System.Diagnostics.Process.Start(pathToBarEXE) 启动Bar的进程我想将该Bar.exe附加到当前运行的调试器以编程方式。我有一个应该做它(看到它无处不在互联网上)的函数以编程方式将第二个进程附加到.NET上

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

但功能不编译,因为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(); 
      } 
     } 
    } 

,并编译和运行,但是,当它发现酒吧的过程中,如果语句抛出异常The message filter indicated that the application is busy. (Exception from HRESULT: 0x8001010A (RPC_E_SERVERCALL_RETRYLATER))我在做什么错在这里?

回答

1

他们说,在这里:

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

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

相关问题