Condividi tramite


Procedura: Salvare i dati nel file di progetto

Un sottotipo di progetto può salvare e recuperare i dati sottotipo-specifici nel file di progetto. Il pacchetto gestito Framework (MPF) fornisce due interfacce per eseguire questa attività:

  • L'interfaccia di IVsBuildPropertyStorage consente ai valori delle proprietà di accesso dalla sezione di MSBuild del file di progetto. I metodi forniti da IVsBuildPropertyStorage possono essere chiamati da qualsiasi utente ogni volta che l'utente deve caricare o salvare la compilazione relativi dati.

  • IPersistXMLFragment viene utilizzato per rendere persistenti i dati correlati non compilazione in formato libero XML. I metodi forniti da IPersistXMLFragment vengono chiamati da Visual Studio ogni volta che le necessità di Visual Studio di mantenere il non compilazione relativi dati nel file di progetto.

Per ulteriori informazioni su come mantenere la compilazione e il non compilazione dati correlati, vedere Rendere persistenti i dati nel file di progetto MSBuild.

Salvare e recuperare i dati correlati di compilazione

Per salvare una compilazione correlate ai dati nel file di progetto

  • Chiamare il metodo di SetPropertyValue per salvare un percorso completo del file di progetto.

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

Per recuperare la compilazione correlate ai dati del file di progetto

  • Chiamare il metodo di GetPropertyValue per recuperare un percorso completo del file di progetto.

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

Salvare e recuperare i dati correlati non di compilazione

Per salvare il non compilazione correlate ai dati nel file di progetto

  1. Implementare il metodo di IsFragmentDirty per determinare se un frammento XML è stato modificato dal momento dell'ultimo salvataggio del file corrente.

    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. Implementare il metodo di Save per salvare i dati XML nel file di progetto.

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

Per recuperare le informazioni di descrizione che verrà visualizzata per il nome della proprietà evidenziato, la finestra Proprietà chiama M:System.Runtime.InteropServices.ComTypes.ITypeInfo2.GetDocumentation2(System.Int32,System.String@,System.Int32@,System.String@) per la proprietà selezionata, specificando l'attributo desiderato lcid per la stringa di output.

  1. Implementare il metodo di InitNew per inizializzare le proprietà dell'estensione di progetto e altri dati dell'build-indipendente. Questo metodo viene chiamato se non sono disponibili dati di configurazione XML presenti nel file di progetto.

    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. Implementare il metodo di Load per caricare i dati XML dal file di progetto.

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

Nota

Tutti gli esempi di codice forniti in questo argomento fanno parte di un esempio più esaustivo Esempi di estensibilità di Visual Studio.

Vedere anche

Concetti

Rendere persistenti i dati nel file di progetto MSBuild