Грэг Дункан
Если вы читаете это блог, то весьма вероятно, что вы пользуетесь Visual Studio. И подобно большинству разработчиков вам нравится организовывать файлы и каталоги проектов "только таким способом". Но что если вам захочется придерживаться иной организации? Или иметь несколько планов расположения файлов? Не будет ли здорово, если вы сможете отмечать файл меткой и затем просматривать их в соответствии с этими метками? А также применять множество меток, так чтобы иметь несколько представлений для проекта? Например, как бизнес-представление и разработческое представление?
VsTagExplorer
Вас не раздражает то, что вы обязаны просматривать файлы решения способом, предоставляемым Visual Studio? С сегодняшнего дня вы можете просматривать свои файлы гораздо более удобным способом! Начните помечать файлы очень простым способом!
Щелкните правой клавишей мыши на проводнике решений, задайте метки каждому файлу, и затем начните передвигаться по меткам с помощью TagExplorer"а! (View->Other Windows->Tag explorer).


Взглянем на проект...

public void Tag()
{
     IEnumerable<FileItem> selectedItems = envDte.SelectedItems
         .OfType<SelectedItem>()
         .Select(si => new FileItem {Name = si.Name});
     IEnumerable<string> candidateTags = GetCandidateStrings(selectedItems);
     IEnumerable<string> tags = selector.Select(candidateTags);
     if (!selector.Selected) return;
     foreach (SelectedItem rootProjectItem in envDte.SelectedItems.OfType<SelectedItem>())
     {
         IVsHierarchy hierarchy;
         ((IVsSolution) solution).GetProjectOfUniqueName(
             rootProjectItem.ProjectItem.ContainingProject.UniqueName, out hierarchy);
         var buildPropertyStorage = hierarchy as IVsBuildPropertyStorage;
         if (buildPropertyStorage != null)
         {
             uint itemId;
             var fullPath =
                 (string) rootProjectItem.ProjectItem.Properties.Item("FullPath").Value;
             hierarchy.ParseCanonicalName(fullPath, out itemId);
             string newTags = string.Join(" ", tags);
             string currentTags;
             buildPropertyStorage.GetItemAttribute(itemId, "Tags", out currentTags);
             ApplyTags(currentTags, newTags, buildPropertyStorage, itemId);
         }
     }
}
 
Этот проект демонстрирует несколько вещей. Что вам не обязательно довольствоваться тем, как Visual Studio организует ваши файлы, как подключиться к проекту Visual Studio, и, наконец, как создавать распространяемые расширения Visual Studio.