Сохранение данных в файлах проекта
Подтип проекта может сохранять и извлекать данные, относящиеся к подтипу, в файле проекта. Платформа управляемых пакетов (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; }
Save Реализуйте метод для сохранения XML-данных в файле проекта.
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;
Load Реализуйте метод для загрузки XML-данных из файла проекта.
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 <= 1 || node.FirstChild.ChildNodes[1].Name != updateTargetsTag) break; this.UpdateTargetList = bool.Parse(node.FirstChild.ChildNodes[1].InnerText); 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).Load(ref guidFlavor, storage, pszXMLFragment); return VSConstants.S_OK; }
Примечание.
Все примеры кода, приведенные в этом разделе, являются частями более крупного примера в примерах VSSDK.