2012-09-07 37 views
5

Pracuję nad pakietem Visual Studio i napisałem kod, który spowoduje, że plik w Eksploratorze rozwiązań będzie zależny od innego pliku.Jak programowo odświeżyć/załadować ponownie projekt VS po zmodyfikowaniu pliku bazowego?

Oznacza to, że daje im taką samą relację, jak pliki z kodem źródłowym lub pliki projektantów, gdzie pojawiają się zagnieżdżone pod plikiem nadrzędnym za pomocą ikony plus/minus.

+ MainForm.cs 


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

Kod, który pisałem skutecznie i poprawnie modyfikuje plik projektu bazowego, jednak zmiana ta nie jest odzwierciedlona w Solution Explorer, aż projekt zostanie zamknięty i ponownie otwarty.

Poszukuję kodu, który odświeży lub przeładuje projekt, aby zmiana była natychmiast widoczna w Eksploratorze rozwiązań.

dalsze informacje ...

Oto kod sudo, który pokazuje mechanizm, dzięki któremu tworzę plik zależnej.

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

Próbowałem również dodać to, aby spróbować przeładować projekt, ale nie ma to żadnego wpływu.

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

W jaki sposób znalazłeś wartość użytą dla projectItemIdentifier i czy znalazłeś dobre rozwiązanie do odświeżania, które nie wymagało rozładowania projektu? – Colin

+0

@Colin To dość brutalny sposób wprowadzania zmian w projekcie przez ręczne manipulowanie plikiem XML projektu. Wymagane będzie ponowne załadowanie, ale nigdy nie znalazłem na to dobrego sposobu. O wiele lepszym sposobem jest znalezienie właściwej operacji w interfejsie API VS (EnvDTE) i wywołanie tego. Przechodzenie przez API jest dużo bardziej niezawodne, a VS zajmie się koniecznym przeładowaniem. Jaką operację próbujesz wykonać? Jeśli dodamy plik zależny, mogę w tym pomóc. – Martyn

+0

@Colin Przepraszamy, nie mogę pomóc z projektemItemIdentifier. W końcu nie używałem tego ani żadnego podobnego kodu. Interfejs VS API jest bardziej zorientowany obiektowo i działa poprzez dostarczanie obiektów ProjectItem zamiast łańcuchów identyfikatorów. Obiekty ProjectItems (faktycznie pliki i foldery w projekcie) można odzyskać przez iterowanie właściwości Project.ProjectItems. Jeśli naprawdę potrzebujesz projectItemIdentifier, sugerowałbym debugowanie i przeglądanie właściwości obiektu ProjectItem. – Martyn

Odpowiedz

8

AFAIK jedynym sposobem na to jest poprzez automatyzację Solution Explorer narzędziowni okna:

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

zauważyć, że jeśli projekt nie został zapisany, użytkownik otrzyma okno dialogowe pole przed wywołaniem "Project.UnloadProject".