Сохранение данных в файлах проекта
Подтип проекта может сохранять и извлекать данные, относящиеся к подтипу, в файле проекта. Платформа управляемых пакетов (MPF) предоставляет два интерфейса для выполнения этой задачи:
- Интерфейс IVsBuildPropertyStorage позволяет получить доступ к значениям свойств из раздела MSBuild файла проекта. Методы, предоставляемые IVsBuildPropertyStorage любым пользователем, могут вызываться любым пользователем, когда пользователю нужно загружать или сохранять связанные данные сборки.
- Используется IPersistXMLFragment для сохранения данных, связанных с сборкой, в ФОРМАТЕ XML свободной формы. Методы, предоставляемые IPersistXMLFragment Visual Studio, вызываются всякий раз, когда Visual Studio должен сохранять данные, не связанные с сборкой, в файле проекта. Дополнительные сведения о сохранении сборок и не связанных с сборкой данных см. в разделе «Сохранение данных» в файле проекта MSBuild.
Сохранение и извлечение связанных данных сборки
Сохранение связанных данных сборки в файле проекта
- SetPropertyValue Вызовите метод, чтобы сохранить полный путь к файлу проекта.
private SpecializedProject project; IVsBuildPropertyStorage projectStorage = (IVsBuildPropertyStorage)project; string newFullPath = GetNewFullPath(); // Set a full path of the project file. ErrorHandler.ThrowOnFailure(projectStorage.SetPropertyValue( "MSBuildProjectDirectory", String.Empty, (uint)_PersistStorageType.PST_PROJECT_FILE, newFullPath));
Получение связанных данных сборки из файла проекта
- GetPropertyValue Вызовите метод, чтобы получить полный путь к файлу проекта.
private SpecializedProject project; IVsBuildPropertyStorage projectStorage = (IVsBuildPropertyStorage)project; string fullPath; // Get a full path of the project file. ErrorHandler.ThrowOnFailure(projectStorage.GetPropertyValue( "MSBuildProjectDirectory", String.Empty, (uint)_PersistStorageType.PST_PROJECT_FILE, out fullPath));
Сохранение и извлечение связанных с сборкой данных
Сохранение данных, связанных с сборкой, в файле проекта
- IsFragmentDirty Реализуйте метод, чтобы определить, изменился ли фрагмент XML после последнего сохранения в текущем файле.
public int IsFragmentDirty(uint storage, out int pfDirty) < pfDirty = 0; switch (storage) < case (uint)_PersistStorageType.PST_PROJECT_FILE: < if (isDirty) pfDirty |= 1; break; >case (uint)_PersistStorageType.PST_USER_FILE: < // We do not store anything in the user file. break; >> // Forward the call to inner flavor(s) if (pfDirty == 0 && innerCfg != null && this.innerCfg is IPersistXMLFragment) return ((IPersistXMLFragment)this.innerCfg).IsFragmentDirty(storage, out pfDirty); return VSConstants.S_OK; >
public int Save(ref Guid guidFlavor, uint storage, out string pbstrXMLFragment, int fClearDirty) < pbstrXMLFragment = null; if (IsMyFlavorGuid(ref guidFlavor)) < switch (storage) < case (uint)_PersistStorageType.PST_PROJECT_FILE: < // Create XML for our data. XmlDocument doc = new XmlDocument(); XmlNode root = doc.CreateElement(this.GetType().Name); XmlNode node = doc.CreateElement(targetsTag); node.AppendChild(doc.CreateTextNode(this.TargetsToExecute)); root.AppendChild(node); node = doc.CreateElement(updateTargetsTag); node.AppendChild(doc.CreateTextNode(this.UpdateTargetList.ToString())); root.AppendChild(node); doc.AppendChild(root); // Get XML fragment representing our data pbstrXMLFragment = doc.InnerXml; if (fClearDirty != 0) isDirty = false; break; >case (uint)_PersistStorageType.PST_USER_FILE: < // We do not store anything in the user file. break; >> > // Forward the call to inner flavor(s) if (this.innerCfg != null && this.innerCfg is IPersistXMLFragment) return ((IPersistXMLFragment)this.innerCfg).Save(ref guidFlavor, storage, out pbstrXMLFragment, fClearDirty); return VSConstants.S_OK; >
Получение данных, связанных с сборкой, в файле проекта
- InitNew Реализуйте метод для инициализации свойств расширения проекта и других независимых от сборки данных. Этот метод вызывается, если в файле проекта отсутствуют данные конфигурации XML.
public int InitNew(ref Guid guidFlavor, uint storage) < //Return,if it is our guid. if (IsMyFlavorGuid(ref guidFlavor)) return VSConstants.S_OK; //Forward the call to inner flavor(s). if (this.innerCfg != null && this.innerCfg is IPersistXMLFragment) return ((IPersistXMLFragment)this.innerCfg).InitNew(ref guidFlavor, storage); return VSConstants.S_OK;
public int Load(ref Guid guidFlavor, uint storage, string pszXMLFragment) < if (IsMyFlavorGuid(ref guidFlavor)) < switch (storage) < case (uint)_PersistStorageType.PST_PROJECT_FILE: < // Load our data from the XML fragment. XmlDocument doc = new XmlDocument(); XmlNode node = doc.CreateElement(this.GetType().Name); node.InnerXml = pszXMLFragment; if (node == null || node.FirstChild == null || node.FirstChild.ChildNodes.Count == 0 || node.FirstChild.ChildNodes[0].Name != targetsTag) break; this.TargetsToExecute = node.FirstChild.ChildNodes[0].InnerText; if (node.FirstChild.ChildNodes.Count case (uint)_PersistStorageType.PST_USER_FILE: < // We do not store anything in the user file. break; >> > // Forward the call to inner flavor(s) if (this.innerCfg != null && this.innerCfg is IPersistXMLFragment) return ((IPersistXMLFragment)this.innerCfg).Load(ref guidFlavor, storage, pszXMLFragment); return VSConstants.S_OK; >
Все примеры кода, приведенные в этом разделе, являются частями более крупного примера в примерах VSSDK.
Связанный контент
Сохранение проекта
Сохраняемость — это ключевое руководство по проектированию проекта. Большинство проектов используют элементы проекта, представляющие файлы; Visual Studio также поддерживает проекты, данные которых не основаны на файлах. Файлы, принадлежащие проекту и файлу проекта, должны быть сохранены. Интегрированная среда разработки указывает проекту сохранить себя или элемент проекта.
Шаблоны для проектов передаются в фабрику проектов. Шаблоны должны поддерживать инициализацию всех элементов проекта в соответствии с требованиями конкретного типа проекта. Эти шаблоны позже можно сохранить в виде файлов проекта и управлять с помощью интегрированной среды разработки с помощью решения. Дополнительные сведения см. в статье "Создание экземпляров проекта с помощью фабрик и решений проекта".
Элементы проекта могут быть файловыми или нефайловыми:
- Элементы на основе файлов могут быть локальными или удаленными. Например, в веб-проектах C#подключения к файлам в удаленной системе сохраняются локально, а сами файлы сохраняются в удаленной системе.
- Элементы, не основанные на файлах, могут сохранять элементы в базе данных или репозитории.
Фиксация моделей
После определения расположения элементов проекта необходимо выбрать соответствующую модель фиксации. Например, в файловой модели с локальными файлами каждый проект можно сохранить автономно. В модели репозитория можно сохранить несколько элементов в одной транзакции. Дополнительные сведения см. в разделе "Решения по проектированию типов проектов".
Чтобы определить расширения имен файлов, проекты реализуют IPersistFileFormat интерфейс, который предоставляет сведения, позволяющие клиенту объекта реализовать диалоговое окно "Сохранить как", то есть заполнить раскрывающийся список "Сохранить как тип" и управлять начальным расширением имени файла.
Интегрированная среда разработки вызывает IPersistFileFormat интерфейс в проекте, чтобы указать, что проект должен сохранять элементы проекта соответствующим образом. Поэтому объект владеет всеми аспектами файла и формата. Сюда входит имя формата объекта.
В случае, если элементы не являются файлами, IPersistFileFormat по-прежнему сохраняется нефайловая версия. Файлы проекта, такие как VBP-файлы для проектов Visual Basic или vcproj-файлов для проектов Visual C++, также должны сохраняться.
Для действий сохранения интегрированная среда разработки проверяет запущенную таблицу документов (RDT), а иерархия передает команды IVsPersistHierarchyItem в интерфейсы и IVsPersistHierarchyItem2 интерфейсы. Метод IsItemDirty реализуется для определения того, был ли изменен элемент. Если элемент имеется, SaveItem метод реализуется для сохранения измененного элемента.
Методы интерфейса IVsPersistHierarchyItem2 используются для определения того, может ли элемент быть перезагрузлен и, если элемент может быть, чтобы перезагрузить его. Кроме того, метод можно реализовать, IgnoreItemFileChanges чтобы изменить элементы карта без сохранения.
См. также
- Контрольный список. Создание типов проектов
- Создание экземпляров проекта с помощью фабрик проектов
Сохранение свойства элемента проекта
Может потребоваться сохранить свойство, добавляемое в элемент проекта, например автор исходного файла. Это можно сделать, сохраняя свойство в файле проекта.
Первым шагом для сохранения свойства в файле проекта является получение иерархии проекта в качестве IVsHierarchy интерфейса. Этот интерфейс можно получить с помощью службы автоматизации или с помощью IVsMonitorSelection. После получения интерфейса его можно использовать для определения выбранного в данный момент элемента проекта. После получения идентификатора элемента проекта можно использовать SetItemAttribute для добавления свойства.
В следующих процедурах вы сохраняете свойство Author VsPkg.cs со значением Tom в файле проекта.
Получение иерархии проекта с помощью объекта DTE
- Добавьте следующий код в VSPackage:
EnvDTE.DTE dte = (EnvDTE.DTE)Package.GetGlobalService(typeof(EnvDTE.DTE)); EnvDTE.Project project = dte.Solution.Projects.Item(1); string uniqueName = project.UniqueName; IVsSolution solution = (IVsSolution)Package.GetGlobalService(typeof(SVsSolution)); IVsHierarchy hierarchy; solution.GetProjectOfUniqueName(uniqueName, out hierarchy);
Сохранение свойства элемента проекта с помощью объекта DTE
- Добавьте следующий код в код, указанный в методе в предыдущей процедуре:
IVsBuildPropertyStorage buildPropertyStorage = hierarchy as IVsBuildPropertyStorage; if (buildPropertyStorage != null)
Получение иерархии проекта с помощью IVsMonitorSelection
- Добавьте следующий код в VSPackage:
IVsHierarchy hierarchy = null; IntPtr hierarchyPtr = IntPtr.Zero; IntPtr selectionContainer = IntPtr.Zero; uint itemid; // Retrieve shell interface in order to get current selection IVsMonitorSelection monitorSelection = Package.GetGlobalService(typeof(SVsShellMonitorSelection)) as IVsMonitorSelection; if (monitorSelection == null) throw new InvalidOperationException(); try < // Get the current project hierarchy, project item, and selection container for the current selection // If the selection spans multiple hierachies, hierarchyPtr is Zero IVsMultiItemSelect multiItemSelect = null; ErrorHandler.ThrowOnFailure( monitorSelection.GetCurrentSelection( out hierarchyPtr, out itemid, out multiItemSelect, out selectionContainer)); // We only care if there is only one node selected in the tree if (!(itemid == VSConstants.VSITEMID_NIL || hierarchyPtr == IntPtr.Zero || multiItemSelect != null || itemid == VSConstants.VSITEMID_SELECTION)) < hierarchy = Marshal.GetObjectForIUnknown(hierarchyPtr) as IVsHierarchy; >> finally
Сохранение свойства выбранного элемента проекта с учетом иерархии проекта
- Добавьте следующий код в код, указанный в методе в предыдущей процедуре:
IVsBuildPropertyStorage buildPropertyStorage = hierarchy as IVsBuildPropertyStorage; if (buildPropertyStorage != null)
Проверка сохранения свойства
- Запустите Visual Studio, а затем откройте или создайте решение.
- Выберите элемент проекта VsPkg.cs в Обозреватель решений.
- Используйте точку останова или иначе определите загрузку VSPackage и выполняется SetItemAttribute.
Примечание. Вы можете автоматически загрузить VSPackage в контексте SolutionExists_guidпользовательского интерфейса. Дополнительные сведения см. в разделе Load VSPackages.
Связанный контент
Обмен картами кода
Вы можете сохранить карты кода в рамках проекта Visual Studio в виде изображения или в виде файла XPS.
Совместное использование карты кода с другими пользователями Visual Studio
Для сохранения карты используйте меню Файл .
Чтобы сохранить карту в рамках определенного проекта, на панели инструментов карты выберите "Поделиться>перемещением " и выберите проект, в который нужно сохранить карту.

Visual Studio сохраняет карту в виде DGML-файла , который можно поделиться с другими пользователями Visual Studio Enterprise и Visual Studio Professional.
Перед тем как предоставить общий доступ к карте пользователям Visual Studio Professional, разверните все группы, отобразите скрытые узлы и связи между группами и извлеките все удаленные узлы, которые нужно показать другим пользователям. В противном случае другие пользователи не увидят эти элементы.
При сохранении карты, находящейся в проекте моделирования или скопированной из такого проекта в другое место, может возникнуть следующая ошибка:
«Невозможно сохранить имяФайла вне каталога проекта. Связанные элементы не поддерживаются.»
Visual Studio выводит ошибку, но в любом случае создает сохраненную версию. Чтобы избежать этой ошибки, создавайте карту вне проекта моделирования. Затем ее можно сохранить в нужном месте. Простое копирование файла в другое место в решении и последующая попытка сохранения не помогают.
Экспорт карты кода в виде изображения
При экспорте карты кода в виде изображения его можно скопировать в другие приложения, такие как Microsoft Word или PowerPoint.
- На панели инструментов карты кода выберите "Поделиться> электронной почтой как изображение" или "Копировать изображение".
- Вставьте изображение в другое приложение.
Экспорт карты в формате XPS-файла
При экспорте карты кода в виде файла XPS его можно увидеть в средствах просмотра XML или XAML.
- На панели инструментов карты кода выберите "Поделиться>электронной почтой как переносимой XPS" или "Сохранить как переносимую XPS".
- Выберите место для сохранения файла.
- Укажите имя для карты кода. Убедитесь, что поле "Сохранить как тип " имеет значение XPS-файлы (*.xps). Нажмите кнопку Сохранить.