Freigeben über


Gewusst wie: Speichern von Daten in Projektdateien

Ein Projekt kann untertyp Untertyp spezifisch Daten in der Projektdatei speichern und abrufen. Das verwaltete Paketframework (MPF) stellt zwei Schnittstellen, um diese Aufgabe auszuführen:

  • Die IVsBuildPropertyStorage-Schnittstelle kann für den Zugriff auf eigenschaftswerten vom MSBuild-Abschnitt der Projektdatei. Die Methoden, die von IVsBuildPropertyStorage bereitgestellt werden, können von jedem Benutzer aufgerufen werden, wenn die Nutzerbedarfe Build zu laden oder verknüpfte Daten zu speichern.

  • IPersistXMLFragment wird verwendet, um Nicht Build verknüpfte Daten in der Freiform XML beizubehalten. Die Methoden, die von IPersistXMLFragment bereitgestellt werden, werden durch Visual Studio immer dann aufgerufen, wenn Visual Studio Nicht Build verknüpfte Daten in der Projektdatei beibehalten muss.

Weitere Informationen zum Erstellen eines Builds und Nicht Build verknüpfte Daten finden Sie unter Beibehalten von Daten in der MSBuild-Projektdateibeibehält.

Build Speichern und Abrufen von verknüpften Daten

So erstellen Sie einen Build zu speichern verknüpfte Daten in der Projektdatei

  • Rufen Sie die SetPropertyValue-Methode auf, um einen vollständigen Pfad der Projektdatei zu speichern.

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

Um verknüpfte Daten abzurufen Erstellung von der Projektdatei

  • Rufen Sie die GetPropertyValue-Methode auf, um einen vollständigen Pfad der Projektdatei abzurufen.

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

Nicht Build Speichern und Abrufen von verknüpften Daten

Um verknüpfte Daten zu Builds nicht in der Projektdatei speichern

  1. Implementieren Sie die IsFragmentDirty-Methode, um zu bestimmen, ob ein XML-Fragment geändert wurde, seit es zuletzt in die aktuelle Datei gespeichert wurden.

    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;
    
    }
    
  2. Implementieren Sie die Save-Methode, um XML-Daten in der Projektdatei zu speichern.

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

So führen Sie Builds Nicht verknüpfte Daten in der Projektdatei ab

  1. Implementieren Sie die InitNew-Methode, um Eigenschaften für das Projekt Erstellung-unabhängige und andere Daten zu initialisieren. Diese Methode wird aufgerufen, wenn keine XML-Konfigurations von Daten gibt, die in der Projektdatei vorhanden sind.

    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;
    
  2. Implementieren Sie die Load-Methode, um XML-Daten aus der Projektdatei zu laden.

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

Hinweis

Alle Codebeispiele in diesem Thema bereitgestellt werden, sind Teil eines umfangreicheren Beispiels, Visual Studio-Erweiterbarkeits-Beispiele.

Siehe auch

Konzepte

Beibehalten von Daten in der MSBuild-Projektdatei