Guardar datos en archivos de proyectoSaving Data in Project Files

Un subtipo de proyecto puede guardar y recuperar datos específicos de 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 de la 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 puede llamarse mediante cualquier usuario siempre que el usuario sólo necesita cargar o guardar genera datos relacionados.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 utiliza para conservar los datos relacionados de compilación no 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 a Visual StudioVisual Studio cada vez que Visual StudioVisual Studio necesita conservar datos relacionados de compilación no en el archivo de proyecto.The methods provided by IPersistXMLFragment are called by Visual StudioVisual Studio whenever Visual StudioVisual Studio needs to persist non-build related data in the project file.

    Para obtener más información acerca de cómo conservar compilación y los datos relacionados de no compilación, consulte guardar datos en el archivo de proyecto de MSBuild.For more information on how to persist build and non-build related data, see Persisting 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 guarda en su 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 independiente 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 método 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;  
    }  
    

Nota

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

Conservación de datos en el archivo de proyecto de MSBuildPersisting Data in the MSBuild Project File