4

C# で Visual Studio の現在のインスタンス (EnvDTE) を取得するにはどうすればよいですか?

次のコード行を含む複数のプロセスのビジュアルスタジオがある場合、オブジェクトを取得しますEnvDTE80.DTE2:

EnvDTE80.DTE2 dte2 = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.11.0");

この時点で、現在のソリューションを取得するにはどうすればよいですか?

4

1 に答える 1

4

実行中のオブジェクト テーブルを使用してすべてのインスタンスを取得し、必要なインスタンスを選択します。

これ以上のことはできないと思います。これは、デバッガーを VS インスタンスにアタッチする方法に似ています。リストから 1 つを選択する必要があります。

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);
于 2013-01-06T20:45:27.830 に答える