2016-08-14 10 views
0

Ich weiß, es klingt komisch, aber ich möchte Folgendes erreichen: Ich schreibe auf eine VSIX-Erweiterung, die alle meine Dateien liest, die in einem normalen Projekt oder in der Lösung selbst enthalten sind . Um auf Lösungsdateien oder Lösungsordner zuzugreifen, organisiert Microsoft diese auch in der DTE-Projektsammlung. Schauen Sie sich das folgende Beispiel:EnvDTE Projekt separates C# -Projekt aus Lösungsprojekt

Test solution

So können Sie sehen, dass in meiner Lösung gibt es 3 Dateien: zwei Lösungsdateien und ein Projektelement-Datei.

Nun nehmen Sie einen Blick, wenn ich die DTE Projektsammlung zugreifen:

enter image description here

Wie Sie die „Projekte“ in der Lösung keinen Fullnamen haben sehen können. In meiner Erweiterung muss ich normale Projekte und "Lösungsprojekte" unterscheiden und die einzige Möglichkeit, dies zu tun, ist zu überprüfen, ob die FullName-Eigenschaft null ist. Also ich weiß, das ist eine schreckliche Lösung, aber weißt du bessere Möglichkeiten, das zu tun? AND: befinden sich Lösungsdateien oder Elemente immer im Stammverzeichnis, in dem sich die .sln-Datei befindet?

Grüße Nico

Antwort

0

Statt die DTE Projekt Sammlung verwenden, versuchen Solution interface instead an die DTE nach oben bewegt.

Wie Sie aus der API sehen können, wird dort die Fullname-Eigenschaft sowie die Sammlung von Projekten gefunden.

Here's an example:

using System.Runtime.InteropServices; 
using System.Windows.Forms; 
using Microsoft.VisualStudio; 
using Microsoft.VisualStudio.Shell.Interop; 
using Microsoft.VisualStudio.OLE.Interop; 
using Microsoft.VisualStudio.Shell; 

namespace Company.MyVSPackage 
{ 
    // Only load the package if there is a solution loaded 
    [ProvideAutoLoad(VSConstants.UICONTEXT.SolutionExists_string)] 
    [PackageRegistration(UseManagedResourcesOnly = true)] 
    [InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)] 
    [Guid(GuidList.guidMyVSPackagePkgString)] 
    public sealed class MyVSPackagePackage : Package 
    { 
     public MyVSPackagePackage() 
     { 
     } 

     protected override void Initialize() 
     { 
     base.Initialize(); 

     ShowSolutionProperties(); 
     } 

     private void ShowSolutionProperties() 
     { 
     SVsSolution solutionService; 
     IVsSolution solutionInterface; 
     bool isSolutionOpen; 
     string solutionDirectory; 
     string solutionFullFileName; 
     int projectCount; 

     // Get the Solution service 
     solutionService = (SVsSolution)this.GetService(typeof(SVsSolution)); 

     // Get the Solution interface of the Solution service 
     solutionInterface = solutionService as IVsSolution; 

     // Get some properties 

     isSolutionOpen = GetPropertyValue<bool>(solutionInterface, __VSPROPID.VSPROPID_IsSolutionOpen); 
     MessageBox.Show("Is Solution Open: " + isSolutionOpen); 

     if (isSolutionOpen) 
     { 
      solutionDirectory = GetPropertyValue<string>(solutionInterface, __VSPROPID.VSPROPID_SolutionDirectory); 
      MessageBox.Show("Solution directory: " + solutionDirectory); 

      solutionFullFileName = GetPropertyValue<string>(solutionInterface, __VSPROPID.VSPROPID_SolutionFileName); 
      MessageBox.Show("Solution full file name: " + solutionFullFileName); 

      projectCount = GetPropertyValue<int>(solutionInterface, __VSPROPID.VSPROPID_ProjectCount); 
      MessageBox.Show("Project count: " + projectCount.ToString()); 
     } 
     } 

     private T GetPropertyValue<T>(IVsSolution solutionInterface, __VSPROPID solutionProperty) 
     { 
     object value = null; 
     T result = default(T); 

     if (solutionInterface.GetProperty((int)solutionProperty, out value) == Microsoft.VisualStudio.VSConstants.S_OK) 
     { 
      result = (T)value; 
     } 
     return result; 
     } 
    } 
} 

Credit: Unser Freund Carlos Quintero war oben für den Code verantwortlich.

Verwandte Themen