.net - 运行 Visual Studio 2010 实例并以编程方式附加到进程?

标签 .net visual-studio-2010 debugging remoting

我有一个显示进程列表的 WinForms 应用程序 (.net 3.5)。

我希望能够附加到其中一个进程。我有多个 Visual Studio 2010 实例在运行,我想创建一个列表/下拉列表,我在其中选择其中一个实例,然后将调试器附加到它。

获取 VS2010 实例应该不会太难,但我不知道如何调用“附加到进程”命令。我想避免 SendKeys 类型的解决方案,所以我想知道是否有某种方法可以做到这一点?

编辑:澄清一下:我想使用特定的运行 VS2010 来调试外部应用程序。

最佳答案

一种方法是使用 EnvDTE,它是 Visual Studio 的 COM 自动化接口(interface):

http://msdn.microsoft.com/en-us/library/envdte(VS.100).aspx

您可以通过在运行对象表 (ROT) 中查找来获得用于运行 Visual Studio 实例的自动化接口(interface)。拥有接口(interface)实例后,您可以自动选择 Visual Studio 实例以附加到您想要的进程。

以下是如何执行此操作的基本示例。您需要将对项目的引用添加到 EnvDTE。该程序集位于我机器上的以下位置:

C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\PublicAssemblies\EnvDTE.dll

已更新

更新以提供通过进程 ID 获取 Visual Studio 实例自动化接口(interface)的示例。

using System;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
using EnvDTE;

namespace VS2010EnvDte
{
internal class Program
{
    [DllImport("ole32.dll")]
    public static extern int GetRunningObjectTable(int reserved, out IRunningObjectTable prot);

    [DllImport("ole32.dll")]
    public static extern int CreateBindCtx(int reserved, out IBindCtx ppbc);

    private static void Main()
    {
        //ProcessId of the VS instance - hard-coded here.
        int visualStudioProcessId = 5520;

        _DTE visualStudioInstance;

        if (TryGetVSInstance(visualStudioProcessId, out visualStudioInstance))
        {
            Process processToAttachTo = null;

            //Find the process you want the VS instance to attach to...
            foreach (Process process in visualStudioInstance.Debugger.LocalProcesses)
            {
                if (process.Name == @"C:\Users\chibacity\AppData\Local\Google\Chrome\Application\chrome.exe")
                {
                    processToAttachTo = process;
                    break;
                }
            }

            //Attach to the process.
            if (processToAttachTo != null)
            {
                processToAttachTo.Attach();
            }
        }
    }

    private static bool TryGetVSInstance(int processId, out _DTE instance)
    {
        IntPtr numFetched = IntPtr.Zero;
        IRunningObjectTable runningObjectTable;
        IEnumMoniker monikerEnumerator;
        IMoniker[] monikers = new IMoniker[1];

        GetRunningObjectTable(0, out runningObjectTable);
        runningObjectTable.EnumRunning(out monikerEnumerator);
        monikerEnumerator.Reset();

        while (monikerEnumerator.Next(1, monikers, numFetched) == 0)
        {
            IBindCtx ctx;
            CreateBindCtx(0, out ctx);

            string runningObjectName;
            monikers[0].GetDisplayName(ctx, null, out runningObjectName);

            object runningObjectVal;
            runningObjectTable.GetObject(monikers[0], out runningObjectVal);

            if (runningObjectVal is _DTE && runningObjectName.StartsWith("!VisualStudio"))
            {
                int currentProcessId = int.Parse(runningObjectName.Split(':')[1]);

                if (currentProcessId == processId)
                {
                    instance = (_DTE)runningObjectVal;
                    return true;
                }
            }
        }

        instance = null;
        return false;
    }
}
}

关于.net - 运行 Visual Studio 2010 实例并以编程方式附加到进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3268483/

相关文章:

c# - 如何使用使用参数化名称的 log4net RollingFileAppender 在最大文件上滚动?

.net - Oracle ManagedDataAccess Client 和关闭连接

c# - 如何允许在 MessageBox 上复制消息

c++ - 错误 C2065 : undeclared identifier in template function

python - 打印到 Komodo 的输出窗口

java - Eclipse调试HashMap : Logical Structure using Key and Value's toString() method

.net - 对象初始化器性能

c# - 在 Repeater 中更改 LinkBut​​ton 的颜色

visual-studio-2010 - TFS获取特定版本,类型标签删除所有不包含在当前标签中的文件

Angular 2/4 Protractor 调试 e2e 测试