我有一个显示进程列表的 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/