Guardar datos en archivos de proyectoSave data in project files

Un subtipo de proyecto puede guardar y recuperar datos específicos del subtipo en el archivo de proyecto.A project subtype can save and retrieve subtype-specific data in the project file. Managed Package Framework (MPF) proporciona dos interfaces para realizar esta tarea:The Managed Package Framework (MPF) provides two interfaces to accomplish this task:

  • El IVsBuildPropertyStorage interfaz permite a los valores de propiedad de acceso desde el MSBuild sección del archivo del proyecto.The IVsBuildPropertyStorage interface allows to access property values from the MSBuild section of the project file. Los métodos proporcionados por IVsBuildPropertyStorage pueden llamarse cualquier usuario siempre que el usuario debe cargar o guardar datos relacionados de compilación.The methods provided by IVsBuildPropertyStorage can be called by any user whenever the user needs to load or save build related data.

  • El IPersistXMLFragment se usa para conservar los datos relacionados de no compilación en XML de forma libre.The IPersistXMLFragment is used to persist non-build related data in free-form XML. Los métodos proporcionados por IPersistXMLFragment llama Programa para la mejoraVisual Studio cada vez que Programa para la mejoraVisual Studio necesita conservar los datos relacionados de no compilación en el archivo de proyecto.The methods provided by IPersistXMLFragment are called by Programa para la mejoraVisual Studio whenever Programa para la mejoraVisual Studio needs to persist non-build related data in the project file.

    Para obtener más información sobre cómo conservar compilación y los datos relacionados de no compilación, véase conservar los datos en el archivo de proyecto de MSBuild.For more information on how to persist build and non-build related data, see Persist data in the MSBuild project file.

  • Llame a la SetPropertyValue método para guardar una ruta de acceso completa del archivo del proyecto.Call the SetPropertyValue method to save a full path of the project file.

    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));  
    
  • Llame a la GetPropertyValue método para recuperar una ruta de acceso completa del archivo del proyecto.Call the GetPropertyValue method to retrieve a full path of the project file.

    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));  
    
  1. Implemente el IsFragmentDirty método para determinar si un fragmento XML ha cambiado desde la última guardó en el archivo actual.Implement the IsFragmentDirty method to determine whether an XML fragment has changed since it was last saved to its current file.

    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. Implemente el Save método para guardar los datos XML en el archivo de proyecto.Implement the Save method to save the XML data in the project file.

    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;  
    }  
    
  1. Implemente el InitNew método para inicializar las propiedades de extensión de proyecto y otros datos independientes de la compilación.Implement the InitNew method to initialize the project extension properties and other build-independent data. Se llama a este método si no hay ningún dato de configuración XML está presente en el archivo de proyecto.This method is called if there is no XML configuration data present in the project file.

    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. Implemente el Load para cargar los datos XML desde el archivo de proyecto.Implement the Load method to load the XML data from the project file.

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

Note

Todos los ejemplos de código proporcionados en este tema forman parte de un ejemplo más extenso en muestras de VSSDK.All code examples provided in this topic are parts of a larger example in VSSDK samples.

Vea tambiénSee also

Conservar los datos en el archivo de proyecto de MSBuildPersist data in the MSBuild project file