首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取C#中的当前visual studio实例(EnvDTE)

获取C#中的当前visual studio实例(EnvDTE)
EN

Stack Overflow用户
提问于 2013-01-07 04:18:46
回答 1查看 4.5K关注 0票数 4

如何在C #中获取visual studio的当前实例(EnvDTE)?

如果您有多个进程visual studio,使用以下代码行,我将获得对象EnvDTE80.DTE2

代码语言:javascript
复制
EnvDTE80.DTE2 dte2 = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.11.0");

此时,我如何才能获得当前的解决方案?

EN

回答 1

Stack Overflow用户

发布于 2013-01-07 04:45:28

使用运行对象表获取所有实例,然后选择需要的实例。

我不认为你能做得比这更好。这类似于将调试器附加到VS实例的方式。您必须从列表中选择一个。

代码语言:javascript
复制
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);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14186330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档