Ukládání dat v souborech projektu
Podtyp projektu může ukládat a načítat data specifická pro podtypy v souboru projektu. Rozhraní MPF (Managed Package Framework) poskytuje dvě rozhraní k provedení této úlohy:
Rozhraní IVsBuildPropertyStorage umožňuje přístup k hodnotám vlastností z oddílu MSBuild souboru projektu. Metody poskytované libovolným uživatelem IVsBuildPropertyStorage mohou volat vždy, když uživatel potřebuje načíst nebo uložit data související s sestavením.
Slouží IPersistXMLFragment k zachování nevytvořových dat ve formátu XML volného formátu. Metody poskytované IPersistXMLFragment sadou Visual Studio se volají vždy, když sada Visual Studio potřebuje zachovat data související s sestavením v souboru projektu.
Další informace o zachování dat souvisejících se sestavením a nesouvisejí s sestavením naleznete v tématu Zachování dat v souboru projektu MSBuild.
Uložení a načtení dat souvisejících s sestavením
Uložení dat souvisejících s sestavením v souboru projektu
SetPropertyValue Voláním metody uložte úplnou cestu k souboru projektu.
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));
Načtení dat souvisejících s sestavením ze souboru projektu
GetPropertyValue Voláním metody načtěte úplnou cestu k souboru projektu.
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));
Uložení a načtení nevytvořových dat souvisejících s daty
Uložení nevytvořových dat souvisejících se souborem projektu
Implementujte metodu IsFragmentDirty pro určení, zda se fragment XML změnil od posledního uložení do aktuálního souboru.
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; }
Implementujte metodu Save pro uložení dat XML do souboru projektu.
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; }
Načtení nevytvořových dat souvisejících se souborem projektu
Implementujte metodu InitNew pro inicializaci vlastností rozšíření projektu a dalších dat nezávislých na sestavení. Tato metoda se volá, pokud v souboru projektu nejsou k dispozici žádná konfigurační data 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;
Implementujte metodu Load pro načtení dat XML ze souboru projektu.
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; }
Poznámka:
Všechny příklady kódu uvedené v tomto tématu jsou součástí většího příkladu v ukázkách VSSDK.