2012-09-07 13 views
5

Sto sviluppando un pacchetto di Visual Studio e ho scritto del codice che renderà un file in Solution Explorer dipendente da un altro file.Come aggiornare/ricaricare a livello di programmazione un progetto VS dopo aver modificato il file sottostante?

Ciò significa che offre la stessa relazione dei file code-behind o dei file di progettazione, in cui vengono annidati sotto il file principale con un'icona più/meno.

+ MainForm.cs 


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

Il codice che ho scritto con successo e modifica il file di progetto di fondo in modo corretto, ma il cambiamento non si riflette in Esplora soluzioni fino a quando il progetto viene chiuso e riaperto.

Sto cercando un codice che aggiorni o ricarichi il progetto in modo che la modifica sia immediatamente visibile in Esplora soluzioni.

Ulteriori informazioni ...

Ecco il codice di sudo che dimostra il meccanismo con cui creo il file dipendente.

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

Ho anche provato ad aggiungere questo nel tentativo di riavviare il progetto, ma non ha alcun effetto.

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

Come hai trovato il valore che hai usato per projectItemIdentifier e hai trovato una buona soluzione per l'aggiornamento che non implicasse lo scarico del progetto? – Colin

+0

@Colin Questo è un modo piuttosto bruto di forzare le modifiche all'interno di un progetto manipolando manualmente l'XML del file di progetto. Sarà necessaria una ricarica ma non ho mai trovato un buon modo per farlo. Un modo molto migliore è trovare l'operazione corretta all'interno dell'API VS (EnvDTE) e chiamarla al suo posto. Passare attraverso l'API è molto più robusto e VS si prenderà cura di ogni ricarico necessario. Che operazione stai cercando di eseguire? Se aggiungendo un file dipendente, posso aiutarlo. – Martyn

+0

@Colin Spiacente, non posso aiutare con projectItemIdentifier. Ho finito per non utilizzare questo o un codice simile. L'API VS è più orientata agli oggetti e lavora da te fornendo oggetti ProjectItem piuttosto che stringhe identificatore. I ProjectItems (in pratica file e cartelle nel progetto) possono essere recuperati iterando la proprietà Project.ProjectItems. Se hai davvero bisogno di projectItemIdentifier, ti suggerisco di eseguire il debug e osservare le proprietà dell'oggetto ProjectItem. – Martyn

risposta

8

per quanto ne so l'unico modo per farlo è attraverso l'automazione dello strumento della finestra Esplora soluzioni:

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

Si noti che, se il progetto non è stato salvato, l'utente riceverà una finestra casella prima della chiamata "Project.UnloadProject".