2016-08-14 1 views
0

Je sais que cela semble bizarre, mais je veux réaliser ce qui suit: J'écris sur une extension VSIX qui lit tous mes fichiers qui sont inclus dans un projet normal ou dans la solution elle-même . Pour accéder aux fichiers de solution ou aux dossiers de solution, Microsoft les organise également dans la collection de projets DTE. Regardez l'exemple suivant:EnvDTE Projet séparé C# Projet du projet de solution

Test solution

vous pouvez donc voir que, dans ma solution, il y a 3 fichiers: deux fichiers de solution et un fichier d'élément de projet.

maintenant un coup d'oeil quand j'accéder à la collection de projets DTE:

enter image description here

Comme vous pouvez le voir les « projets » dans la solution ont pas FullName. Dans mon extension j'ai besoin de différer des projets normaux et des "projets de solution" et la seule façon que j'ai trouvée pour faire ceci est de vérifier si la propriété FullName est nulle. Donc, je sais que c'est une solution horrible, mais savez-vous de meilleures façons de le faire? ET: Les fichiers ou éléments de la solution sont-ils toujours situés dans le répertoire racine où se trouve le fichier .sln?

salutations Nico

Répondre

0

au lieu d'utiliser la collection de projets DTE, essayez de déplacer jusqu'à l'DTE Solution interface instead.

Comme vous pouvez le voir dans l'API, la propriété fullname y est trouvée, ainsi que la collection de projets.

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; 
     } 
    } 
} 

Crédit: Notre ami Carlos Quintero était responsable du code ci-dessus.