我在visual studio 2010中有一个包含2个项目的解决方案,一个是C#控制台应用程序,我将其称为Foo,另一个是CLR C ++控制台应用程序,我将其称为Bar。 Bar是exe而不是dll。当调试会话启动时,通过运行Foo启动。 Foo使用代码启动Bar的流程
System.Diagnostics.Process procBar = System.Diagnostics.Process.Start(pathToBarEXE)
我想将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;
}
}
}
但该函数无法编译,因为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();
}
}
}
并且它编译并运行,但是当它找到Bar的进程时,if语句抛出异常The message filter indicated that the application is busy. (Exception from HRESULT: 0x8001010A (RPC_E_SERVERCALL_RETRYLATER))
我在这里做错了什么?
答案 0 :(得分:1)
他们在这里说:
http://msdn.microsoft.com/en-us/library/ms228772.aspx
这是因为COM在处理多线程应用程序时遇到了一些问题。他们正在展示示例代码,邀请您在被拒绝时使用IOleMessageFilter
重试来电。