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

标签 c# c++ .net visual-studio-2010 debugging

我在 visual studio 2010 中有一个包含 2 个项目的解决方案,一个是 C# 控制台应用程序,我将其称为 Foo,另一个是 CLR C++ 控制台应用程序,我将其称为 Bar。 Bar 是 exe 而不是 dll。当调试 session 开始时,通过运行 Foo 来启动。 Foo使用代码启动Bar的Process 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 是一个接口(interface)。我已经修改了功能

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语句抛出异常消息过滤器表明应用程序正忙。 (HRESULT 异常:0x8001010A(RPC_E_SERVERCALL_RETRYLATER))我在这里做错了什么?

最佳答案

他们在这里说:

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

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

关于c# - 使用 .NET 以编程方式将第二个进程附加到 VS2010,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16578198/

相关文章:

c# - 将方法转换为 C# 源代码

c# - C#(甚至 CLR)中有多少内置值类型

c++ - 在 ubuntu 中使用 g++ 编译时,Open AL 的函数给出 undefined reference 的错误

c++ - 这种隐式转换是如何发生的?

c# - ParallelEnumerable.Aggregate 用于多种方法

.net - 将字节数组转换为 IP 地址

c# - 如何处理 ASP.NET MVC 框架中的多个提交按钮?

c# - json 需要一个属性 "@class"。如何在c#中定义

c++ - 如何找到最大值和最小值?

.net - 在列表框 WPF 中设置选定项周围的边框