Tworzenie wystąpień projektu przy użyciu fabryk projektów
Typy projektów w programie Visual Studio używają fabryki projektów do tworzenia wystąpień obiektów projektu. Fabryka projektów jest podobna do standardowej fabryki klas dla cocreatable obiektów COM. Jednak obiekty projektu nie są współtworzone; można je tworzyć tylko przy użyciu fabryki projektów.
Środowisko IDE programu Visual Studio wywołuje fabrykę projektów zaimplementowaną w programie VSPackage, gdy użytkownik ładuje istniejący projekt lub tworzy nowy projekt w programie Visual Studio. Nowy obiekt projektu udostępnia środowisko IDE wystarczające informacje, aby wypełnić Eksplorator rozwiązań. Nowy obiekt projektu udostępnia również wymagane interfejsy do obsługi wszystkich odpowiednich akcji interfejsu użytkownika zainicjowanych przez środowisko IDE.
Interfejs można zaimplementować IVsProjectFactory w klasie w projekcie. Zazwyczaj znajduje się on we własnym module.
Projekty, które obsługują agregację przez właściciela, muszą utrwały klucz właściciela w pliku projektu. CreateProject Gdy metoda jest wywoływana w projekcie z kluczem właściciela, należący do niego projekt konwertuje jego klucz właściciela na identyfikator GUID fabryki projektu, a następnie wywołuje CreateProject
metodę w tej fabryce projektów, aby wykonać rzeczywiste tworzenie.
Tworzenie projektu należącego do użytkownika
Właściciel tworzy należący do niego projekt w dwóch fazach:
Wywołując metodę PreCreateForOwner . Daje to właścicielowi projekt szansę utworzenia zagregowanego obiektu projektu na podstawie kontrolki
IUnknown
danych wejściowych . Należący do niego projekt przekazuje wewnętrznyIUnknown
i zagregowany obiekt z powrotem do projektu właściciela. Daje to właścicielowi projekt szansę na przechowywanie wewnętrznegoIUnknown
elementu .Wywołując metodę InitializeForOwner . Należący do niego projekt wykonuje wszystkie wystąpienia, gdy ta metoda jest wywoływana zamiast wywoływania
IVsProjectFactory::CreateProject
, tak jak w przypadku projektów, które nie są własnością. Wyliczenie wejścioweVSOWNEDPROJECTOBJECT
jest zwykle zagregowanym projektem należącym do firmy. Należący do niego projekt może użyć tej zmiennej, aby określić, czy jego obiekt projektu został już utworzony (plik cookie nie ma równej wartości NULL) lub musi zostać utworzony (plik cookie ma wartość NULL).Typy projektów są identyfikowane przez unikatowy identyfikator GUID projektu, podobny do CLSID obiektu COM cocreatable. Zazwyczaj jedna fabryka projektów obsługuje tworzenie wystąpień pojedynczego typu projektu, chociaż istnieje możliwość, że jedna fabryka projektów obsługuje więcej niż jeden identyfikator GUID typu projektu.
Typy projektów są skojarzone z określonym rozszerzeniem nazwy pliku. Gdy użytkownik próbuje otworzyć istniejący plik projektu lub próbuje utworzyć nowy projekt przez sklonowanie szablonu, środowisko IDE używa rozszerzenia w pliku w celu określenia odpowiedniego identyfikatora GUID projektu.
Gdy tylko środowisko IDE określi, czy musi utworzyć nowy projekt, czy otworzyć istniejący projekt określonego typu, środowisko IDE używa informacji w rejestrze systemowym w obszarze [HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\8.0\Projects], aby znaleźć, który pakiet VSPackage implementuje wymaganą fabrykę projektów. Środowisko IDE ładuje ten pakiet VSPackage. W metodzie SetSite pakiet VSPackage musi zarejestrować fabrykę projektu w środowisku IDE, wywołując metodę RegisterProjectType .
Podstawową metodą interfejsu
IVsProjectFactory
jest CreateProject, która powinna obsługiwać dwa scenariusze: otwieranie istniejącego projektu i tworzenie nowego projektu. Większość projektów przechowuje stan projektu w pliku projektu. Zazwyczaj nowe projekty są tworzone przez utworzenie kopii pliku szablonu przekazanego doCreateProject
metody, a następnie otwarcie kopii. Istniejące projekty są tworzone bezpośrednio przez otwarcie pliku projektu przekazanego doCreateProject
metody. MetodaCreateProject
może wyświetlać użytkownikowi dodatkowe funkcje interfejsu użytkownika w razie potrzeby.Projekt może również używać żadnych plików, a zamiast tego przechowywać jego stan projektu w mechanizmie przechowywania innym niż system plików, taki jak baza danych lub serwer sieci Web. W takim przypadku parametr nazwy pliku przekazany do
CreateProject
metody nie jest w rzeczywistości ścieżką systemu plików, ale unikatowym ciągiem — adresem URL — w celu zidentyfikowania danych projektu. Nie trzeba kopiować plików szablonów, które są przekazywane wCreateProject
celu wyzwolenia odpowiedniej sekwencji budowy do wykonania.