2010-01-13 19 views
21

.NET çözümlerinde güncelleştirmeler gerçekleştiren bazı araçlara sahibim, ancak çözümün bulunduğu dizini bilmeleri gerekiyor.Program aracılığıyla Visual Studio IDE çözüm dizinini eklentilerden alma

Bu araçları, IDE Tools menüsünde göründükleri ve bir argüman olarak $(SolutionDir) ürününü sağladıkları Harici Araçlar olarak ekledim. Bu iyi çalışıyor. Ancak, bu araçların kullanıcı için özel bir üst düzey menü aracılığıyla (bir Visual Studio tümleştirme paketi projesi oluşturduğum) ve çözüm düğümlerindeki bir içerik menüsü aracılığıyla kullanıcı IDE'sinde daha kolay erişilmesini istiyorum (bunun için). Bir Visual Studio eklenti projesi oluşturdum). Bu bağlamda mevcut çözüm dizinini bulmanın bir yolunu arıyorum.

ben VisualStudio.DTE nesneden çözüm bilgi almak çalıştı:

EnvDTE.DTE dte = (EnvDTE.DTE)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE"); 
string solutionDir = System.IO.Path.GetDirectoryName(dte.Solution.FullName); 

Ancak bu eklenti ins değil şimdiki çözüm için çözüm dizinini döndürür. Bu değil şimdiki çözüm, IDE için dizin döndü

System.Diagnostics.ProcessStartInfo procStartInfo = new System.Diagnostics.ProcessStartInfo("cmd", "echo $(SolutionDir)"); 

// The following commands are needed to redirect the standard output. 
// This means that it will be redirected to the Process.StandardOutput StreamReader. 
procStartInfo.RedirectStandardOutput = true; 
procStartInfo.UseShellExecute = false; 
// Do not create the black window. 
procStartInfo.CreateNoWindow = true; 
// Now we create a process, assign its ProcessStartInfo and start it 
System.Diagnostics.Process proc = new System.Diagnostics.Process(); 
proc.StartInfo = procStartInfo; 
proc.Start(); 
// Get the output into a string 
string result = proc.StandardOutput.ReadToEnd(); 

Ama:

Ben $(SolutionDir) yankılanan ve geri okuma çalıştı.

Çözüm düğümü CommandBar ile ilgili herhangi bir bilgi görmedim. Alternatif olarak, tanımlanan Visual Studio dış araçlarına programsal olarak erişmenin ve bunları başlatmanın bir yolu olsaydı (önceden tanımlanan makro argümanlarını kullanarak), bu işe yarayacaktı.

Çözüm nedir?

+0

görünüşte bu DTE delilik lol – Terrance

cevap

18

EnvDTE.DTE DTE = (EnvDTE.DTE) System.Runtime.InteropServices.Marshal.GetActiveObject ("VisualStudio.DTE"); string solutionDir = System.IO.Path.GetDirectoryName (dte.Solution.FullName);

Ancak, bu, geçerli çözümü için değil, ins ins dizini için döndürür.

Dizini almak için yaklaşımınız iyi. Sorun nedir, VisualStudio.DTE nesnesini alma biçiminiz. Bu kod nerede denir? Eklentinizde olduğunu varsayıyorum. Visual Studio'da, eklentinizi açtığınız başka bir Visual Studio örneğini açan eklentinizi (hata ayıklama) yürütüyor musunuz? Yani iki Visual Studio örneğiniz var.

GetActiveObject("VisualStudio.DTE") rasgele bir Visual Studio örneği alır. Sizin durumunuzda, eklentiniz için bir yol aldığınız için bir eklenti projesi ile Visual Studio görünür. Bu açıklama için sorununun sebebi ne olurdu.

DTE'u bulmanın doğru yolu çok basit. Aslında, eklentiniz halihazırda çalıştığı DTE'ye başvurur (yani, çözümün açıldığı). Eklenti bağlantı sınıfınızda global bir değişkende _applicationObject depolanır. Eklentiniz, OnConnection olay işleyicisinde başladığında ayarlanır.Yani tüm ihtiyacınız çağırmaktır;

doğru yönde Peter itme ile
string solutionDir = System.IO.Path.GetDirectoryName(_applicationObject.Solution.FullName); 
+0

Teşekkür Peter ile burada izliyorum yine 2+, yani tam da sorunu ve çözüm oldu! Şimdi özel menüler aracılığıyla çıktı penceresine gitmek için çıktıları özel bir pencere yerine yürütmek için bir yol arayacağım ve hepsi mükemmel çalışacaktır. Tekrar teşekkürler. –

6

, ben bir dış çözüm dizinine sahip aracı ve çıkış çıkış bölmesine sonuçları başlatmak için içerik menüsü eklenti kurmak. içinde eklenti bazı örnek cümle:

///-------------------------------------------------------------------------------- 
    /// <summary>This method implements the OnConnection method of the IDTExtensibility2 interface. Receives notification that the Add-in is being loaded.</summary> 
    /// 
    /// <param term='application'>Root object of the host application.</param> 
    /// <param term='connectMode'>Describes how the Add-in is being loaded.</param> 
    /// <param term='addInInst'>Object representing this Add-in.</param> 
    /// <seealso class='IDTExtensibility2' /> 
    ///-------------------------------------------------------------------------------- 
    public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom) 
    { 
     _applicationObject = (DTE2)application; 
     _addInInstance = (AddIn)addInInst; 

     // Get the solution command bar 
     CommandBar solutionCommandBar = ((CommandBars)_applicationObject.CommandBars)["Solution"]; 

     // Set up the main InCode 
     CommandBarPopup solutionPopup = (CommandBarPopup)solutionCommandBar.Controls.Add(MsoControlType.msoControlPopup, System.Reflection.Missing.Value, System.Reflection.Missing.Value, 1, true); 
     solutionPopup.Caption = "InCode"; 

     // Add solution updater submenu 
     CommandBarControl solutionUpdaterControl = solutionPopup.Controls.Add(MsoControlType.msoControlButton, System.Reflection.Missing.Value, System.Reflection.Missing.Value, 1, true); 
     solutionUpdaterControl.Caption = "Update Solution"; 
     updateSolutionMenuItemHandler = (CommandBarEvents)_applicationObject.Events.get_CommandBarEvents(solutionUpdaterControl); 
     updateSolutionMenuItemHandler.Click += new _dispCommandBarControlEvents_ClickEventHandler(updateSolution_Click); 
    } 

    // The event handlers for the solution submenu items 
    CommandBarEvents updateSolutionMenuItemHandler; 

    ///-------------------------------------------------------------------------------- 
    /// <summary>This property gets the solution updater output pane.</summary> 
    ///-------------------------------------------------------------------------------- 
    protected OutputWindowPane _solutionUpdaterPane = null; 
    protected OutputWindowPane SolutionUpdaterPane 
    { 
     get 
     { 
      if (_solutionUpdaterPane == null) 
      { 
       OutputWindow outputWindow = _applicationObject.ToolWindows.OutputWindow; 
       foreach (OutputWindowPane loopPane in outputWindow.OutputWindowPanes) 
       { 
        if (loopPane.Name == "Solution Updater") 
        { 
         _solutionUpdaterPane = loopPane; 
         return _solutionUpdaterPane; 
        } 
       } 
       _solutionUpdaterPane = outputWindow.OutputWindowPanes.Add("Solution Updater"); 
      } 
      return _solutionUpdaterPane; 
     } 
    } 

    ///-------------------------------------------------------------------------------- 
    /// <summary>This method handles clicking on the Update Solution submenu.</summary> 
    /// 
    /// <param term='inputCommandBarControl'>The control that is source of the click.</param> 
    /// <param term='handled'>Handled flag.</param> 
    /// <param term='cancelDefault'>Cancel default flag.</param> 
    ///-------------------------------------------------------------------------------- 
    protected void updateSolution_Click(object inputCommandBarControl, ref bool handled, ref bool cancelDefault) 
    { 
     try 
     { 
      // set up and execute solution updater thread 
      UpdateSolutionDelegate updateSolutionDelegate = UpdateSolution; 
      updateSolutionDelegate.BeginInvoke(UpdateSolutionCompleted, updateSolutionDelegate); 
     } 
     catch (System.Exception ex) 
     { 
      // put exception message in output pane 
      SolutionUpdaterPane.OutputString(ex.Message); 
     } 
    } 

    protected delegate void UpdateSolutionDelegate(); 

    ///-------------------------------------------------------------------------------- 
    /// <summary>This method launches the solution updater to update the solution.</summary> 
    ///-------------------------------------------------------------------------------- 
    protected void UpdateSolution() 
    { 
     try 
     { 
      // set up solution updater process 
      string solutionDir = System.IO.Path.GetDirectoryName(_applicationObject.Solution.FullName); 
      System.Diagnostics.ProcessStartInfo procStartInfo = new System.Diagnostics.ProcessStartInfo(@"SolutionUpdater.exe", solutionDir); 
      procStartInfo.RedirectStandardOutput = true; 
      procStartInfo.UseShellExecute = false; 
      procStartInfo.CreateNoWindow = true; 
      System.Diagnostics.Process proc = new System.Diagnostics.Process(); 
      proc.StartInfo = procStartInfo; 

      // execute the solution updater 
      proc.Start(); 

      // put solution updater output to output pane 
      SolutionUpdaterPane.OutputString(proc.StandardOutput.ReadToEnd()); 
      SolutionUpdaterPane.OutputString("Solution update complete."); 
     } 
     catch (System.Exception ex) 
     { 
      // put exception message in output pane 
      SolutionUpdaterPane.OutputString(ex.Message); 
     } 
    } 

    ///-------------------------------------------------------------------------------- 
    /// <summary>This method completing the update solution thread.</summary> 
    /// 
    /// <param name="ar">IAsyncResult.</param> 
    ///-------------------------------------------------------------------------------- 
    protected void UpdateSolutionCompleted(IAsyncResult ar) 
    { 
     try 
     { 
      if (ar == null) throw new ArgumentNullException("ar"); 

      UpdateSolutionDelegate updateSolutionDelegate = ar.AsyncState as UpdateSolutionDelegate; 
      Trace.Assert(updateSolutionDelegate != null, "Invalid object type"); 

      updateSolutionDelegate.EndInvoke(ar); 
     } 
     catch (System.Exception ex) 
     { 
      // put exception message in output pane 
      SolutionUpdaterPane.OutputString(ex.Message); 
     } 
    } 
+0

Nope, harici bir işlemi yoklamak için bir yol bulamadı, VS Paketinde bir iç süreç olarak ihtiyacım olan şeyi yaptım. –

+0

En azından bir VSPackage kullanıldığında, sonuç sorgulaması için (ya da çıktı bölmesine çıktı akışı) bir çözümüm var. Bu sorunun kapsamı dışında (ve buraya uymayacaktır ..), belki de yeni bir soru açabilir ve oraya cevap vereceğim. –

+0

Tamam, ben bunun için ayrı bir soru attım, cevabınız iyi görünüyorsa kabul ediyorum! http://stackoverflow.com/questions/8345636/is-there-a-good-way-to-stream-the-results-from-an-external-process-into-a-visual –

İlgili konular