如何在 C# 中获取 Visual Studio 的当前实例(EnvDTE)?
如果您有具有以下代码行的多个进程 Visual Studio,我将得到该对象EnvDTE80.DTE2
:
EnvDTE80.DTE2 dte2 = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.11.0");
在这一点上,我怎样才能获得当前的解决方案?
如何在 C# 中获取 Visual Studio 的当前实例(EnvDTE)?
如果您有具有以下代码行的多个进程 Visual Studio,我将得到该对象EnvDTE80.DTE2
:
EnvDTE80.DTE2 dte2 = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.11.0");
在这一点上,我怎样才能获得当前的解决方案?
使用运行对象表获取所有实例,然后选择所需的一个。
我不认为你能做得比这更好。它类似于将调试器附加到 VS 实例的方式。您必须从列表中选择一个。
IEnumerable<DTE> GetInstances()
{
IRunningObjectTable rot;
IEnumMoniker enumMoniker;
int retVal = GetRunningObjectTable(0, out rot);
if (retVal == 0)
{
rot.EnumRunning(out enumMoniker);
IntPtr fetched = IntPtr.Zero;
IMoniker[] moniker = new IMoniker[1];
while (enumMoniker.Next(1, moniker, fetched) == 0)
{
IBindCtx bindCtx;
CreateBindCtx(0, out bindCtx);
string displayName;
moniker[0].GetDisplayName(bindCtx, null, out displayName);
Console.WriteLine("Display Name: {0}", displayName);
bool isVisualStudio = displayName.StartsWith("!VisualStudio");
if (isVisualStudio)
{
var dte = rot.GetObject(moniker) as DTE;
yield return dte;
}
}
}
}
[DllImport("ole32.dll")]
private static extern void CreateBindCtx(int reserved, out IBindCtx ppbc);
[DllImport("ole32.dll")]
private static extern int GetRunningObjectTable(int reserved, out IRunningObjectTable prot);