2012-09-07 16 views
5

Estoy desarrollando un paquete de Visual Studio y he escrito algún código que hará que un archivo en el Explorador de soluciones dependa de otro archivo.¿Cómo actualizo/recarga programáticamente un proyecto VS después de modificar el archivo subyacente?

Lo que esto significa es que les da la misma relación que los archivos de código subyacente o los archivos de diseñador, donde aparecen anidados debajo del archivo principal con un icono más/menos.

+ MainForm.cs 


- MainForm.cs 
    MainForm.Designer.cs 
    MainForm.resx 

El código que he escrito correctamente con éxito y modifica el archivo de proyecto subyacente, sin embargo, el cambio no se refleja en el Explorador de soluciones hasta que el proyecto se cierra y se vuelve a abrir.

Estoy buscando algún código que actualice o vuelva a cargar el proyecto para que el cambio esté visible en el Explorador de soluciones inmediatamente.

Más información ...

Este es el código sudo que demuestra el mecanismo por el cual se crea el archivo dependiente.

IVsBuildPropertyStorage vsBuildPropertyStorage = GetBuildPropertyStorage(); 
vsBuildPropertyStorage.SetItemAttribute(projectItemIdentifier, "DependentUpon", parentFileName); 

También he intentado agregar esto en un intento de hacer que el proyecto se vuelva a cargar, pero no tiene ningún efecto.

project.Save(); 
VSProject obj = project.Object as VSProject; 
obj.Refresh(); 
+0

¿Cómo encontró el valor que utilizó para projectItemIdentifier y se le ocurrió una buena solución de actualización que no implicó la descarga del proyecto? – Colin

+0

@Colin Esta es una manera bastante brutal de realizar cambios dentro de un proyecto manipulando manualmente el XML del archivo de proyecto. Se requerirá una recarga, pero nunca encontré una buena manera de hacerlo. Una forma mucho mejor es encontrar la operación correcta dentro de la VS API (EnvDTE) y llamarla en su lugar. Pasar por la API es mucho más robusto y VS se encargará de cualquier recarga necesaria. ¿Qué operación estás tratando de realizar? Si está agregando un archivo dependiente, entonces puedo ayudar con eso. – Martyn

+0

@Colin Lo siento, no puedo ayudar con el projectItemIdentifier. Terminé no usando este o ningún código similar. La VS API está más orientada a objetos y funciona suministrando objetos ProjectItem en lugar de cadenas de identificador. ProjectItems (efectivamente archivos y carpetas en el proyecto) se puede recuperar iterando la propiedad Project.ProjectItems. Si realmente necesita el projectItemIdentifier, sugeriría la depuración y mirando las propiedades del objeto ProjectItem. – Martyn

Respuesta

8

yo sepa la única manera de hacer esto es a través de la automatización del Explorador de soluciones herramienta de ventana:

EnvDTE.DTE dte = ...; 

string solutionName = Path.GetFileNameWithoutExtension(dte.Solution.FullName); 
string projectName = project.Name; 

dte.Windows.Item(EnvDTE.Constants.vsWindowKindSolutionExplorer).Activate(); 
((DTE2)dte).ToolWindows.SolutionExplorer.GetItem(solutionName + @"\" + projectName).Select(vsUISelectionType.vsUISelectionTypeSelect); 

dte.ExecuteCommand("Project.UnloadProject"); 
dte.ExecuteCommand("Project.ReloadProject"); 

Tenga en cuenta que, si el proyecto no se ha guardado, el usuario recibirá un cuadro de diálogo cuadro anterior a la llamada "Project.UnloadProject".

Cuestiones relacionadas