Udostępnij za pośrednictwem


Generowanie nowego projektu: za kulisami, część pierwsza

Kiedykolwiek myślałem o tym, jak utworzyć własny typ projektu? Zastanawiasz się, co się dzieje po utworzeniu nowego projektu? Przyjrzyjmy się pod maską i zobaczmy, co naprawdę się dzieje.

Istnieje kilka zadań koordynujących program Visual Studio:

  • Wyświetla drzewo wszystkich dostępnych typów projektów.

  • Wyświetla listę szablonów aplikacji dla każdego typu projektu i pozwala wybrać jeden.

  • Zbiera informacje o projekcie dla aplikacji, takie jak nazwa projektu i ścieżka.

  • Przekazuje te informacje do fabryki projektów.

  • Generuje on elementy i foldery projektu w bieżącym rozwiązaniu.

Okno dialogowe Nowy projekt

Wszystko zaczyna się po wybraniu typu projektu dla nowego projektu. Zacznijmy od kliknięcia pozycji Nowy projekt w menu Plik . Zostanie wyświetlone okno dialogowe Nowy projekt , które wygląda mniej więcej tak:

Screenshot of the New Project dialog box.

Przyjrzyjmy się temu bliżej. Drzewo Typy projektów zawiera listę różnych typów projektów, które można utworzyć. Po wybraniu typu projektu, takiego jak Visual C# Windows, zostanie wyświetlona lista szablonów aplikacji, które ułatwiają rozpoczęcie pracy. Zainstalowane szablony programu Visual Studio są instalowane przez program Visual Studio i są dostępne dla dowolnego użytkownika komputera. Nowe szablony, które tworzysz lub zbierasz, można dodać do moich szablonów i są dostępne tylko dla Ciebie.

Po wybraniu szablonu, takiego jak Aplikacja systemu Windows, w oknie dialogowym zostanie wyświetlony opis typu aplikacji. W tym przypadku projekt tworzenia aplikacji przy użyciu interfejsu użytkownika systemu Windows.

W dolnej części okna dialogowego Nowy projekt zobaczysz kilka kontrolek, które zbierają więcej informacji. Widoczne kontrolki zależą od typu projektu, ale zazwyczaj zawierają pole tekstowe Nazwa projektu, pole tekstowe Lokalizacja i powiązany przycisk Przeglądaj oraz pole tekstowe Nazwa rozwiązania i powiązane pole wyboru Utwórz katalog dla rozwiązania.

Wypełnianie okna dialogowego Nowy projekt

Skąd okno dialogowe Nowy projekt pobiera informacje? W tym miejscu istnieją dwa mechanizmy, z których jedna jest przestarzała. Okno dialogowe Nowy projekt łączy i wyświetla informacje uzyskane z obu mechanizmów.

Starsza metoda (przestarzała) używa wpisów rejestru systemowego i plików vsdir. Ten mechanizm jest uruchamiany po otwarciu programu Visual Studio. Nowsza metoda używa plików vstemplate. Ten mechanizm jest uruchamiany po zainicjowaniu programu Visual Studio, na przykład przez uruchomienie polecenia

devenv /setup

lub

devenv /installvstemplates

Typy projektów

Pozycja i nazwy węzłów głównych typów projektów, takich jak Visual C# i Inne języki, są określane przez wpisy rejestru systemu. Organizacja węzłów podrzędnych, takich jak Baza danych i urządzenie inteligentne, odzwierciedla hierarchię folderów zawierających odpowiednie pliki vstemplate. Najpierw przyjrzyjmy się węzłom głównym.

Węzły główne typu projektu

Gdy program Visual Studio zostanie zainicjowany, przechodzi przez podklucze klucza rejestru systemu HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\14.0\NewProjectTemplates\TemplateDirs, aby skompilować i nazwać węzły główne drzewa typów projektów. Te informacje są buforowane do późniejszego użycia. Przyjrzyj się szablonom TemplateDirs\{FAE04EC1-301F-11D3-BF4B-00C04F79EFBC}\/1 klucza. Każdy wpis jest identyfikatorem GUID pakietu VSPackage. Nazwa podklucza (/1) jest ignorowana, ale jego obecność wskazuje, że jest to węzeł główny typów projektów. Węzeł główny może z kolei mieć kilka podklucza, które kontrolują jego wygląd w drzewie Typów projektów. Przyjrzyjmy się niektórym z nich.

(Domyślna)

Jest to identyfikator zasobu zlokalizowanego ciągu, który nazywa węzeł główny. Zasób ciągu znajduje się w satelitarnej biblioteki DLL wybranej przez identyfikator GUID pakietu VSPackage.

W tym przykładzie identyfikator GUID pakietu VSPackage to

{FAE04EC1-301F-11D3-BF4B-00C04F79EFBC}

a identyfikator zasobu (wartość domyślna) węzła głównego (/1) to #2345

Jeśli wyszukasz identyfikator GUID w pobliskim kluczu Pakiety i zbadasz podklucz SatelliteDll, możesz znaleźć ścieżkę zestawu zawierającego zasób ciągu:

<Ścieżka> instalacji programu Visual Studio\VC#\VCSPackages\1033\csprojui.dll

Aby to sprawdzić, otwórz Eksplorator plików i przeciągnij plik csprojui.dll do katalogu programu Visual Studio. Tabela ciągów pokazuje, że zasób #2345 ma podpis Visual C#.

SortPriority

Określa położenie węzła głównego w drzewie Typy projektów.

REG_DWORD 0x00000014 SortPriority (20)

Im niższa liczba priorytetu, tym wyższa pozycja w drzewie.

DeveloperActivity

Jeśli ten podklucz jest obecny, pozycja węzła głównego jest kontrolowana przez okno dialogowe Deweloper Ustawienia. Przykład:

DeveloperActivity REG_SZ VC#

wskazuje, że program Visual C# będzie węzłem głównym, jeśli program Visual Studio jest ustawiony na potrzeby programowania w języku Visual C++. W przeciwnym razie będzie to węzeł podrzędny innych języków.

Folder

Jeśli ten podklucz jest obecny, węzeł główny stanie się węzłem podrzędnym określonego folderu. Lista możliwych folderów jest wyświetlana pod kluczem

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\NewProjectTemplates\PseudoFolders

Na przykład wpis Projekty bazy danych zawiera klucz folderu zgodny z wpisem Inne typy projektów w pseudofolderach. W drzewie Typy projektów projekty baz danych będą węzłem podrzędnym innych typów projektów.

Węzły podrzędne typu projektu i pliki vstdir

Pozycja węzłów podrzędnych w drzewie Typy projektów jest zgodna z hierarchią folderów w folderach ProjectTemplates. W przypadku szablonów maszyn (zainstalowane szablony programu Visual Studio) typową lokalizacją jest \Program Files\Microsoft Visual Studio 14.0\Common7\IDE\ProjectTemplates\ i szablony użytkowników (Moje szablony), typową lokalizacją jest \Moje dokumenty\Visual Studio 14.0\Templates\ProjectTemplates\. Hierarchie folderów z tych dwóch lokalizacji są scalane w celu utworzenia drzewa Typów projektów.

W przypadku programu Visual Studio z ustawieniami dewelopera języka C# drzewo Typy projektów wygląda następująco:

Screenshot of the Project types folder tree in Visual Studio with C# developer settings.

Odpowiedni folder ProjectTemplates wygląda następująco:

Screenshot of the Project Templates folder tree in Visual Studio with C# developer settings.

Po otwarciu okna dialogowego Nowy projekt program Visual Studio przechodzi przez folder ProjectTemplates i ponownie utworzy jego strukturę w drzewie Typy projektów z pewnymi zmianami:

  • Węzeł główny w drzewie Typy projektów jest określany przez szablon aplikacji.

  • Nazwa węzła może być zlokalizowana i może zawierać znaki specjalne.

  • Kolejność sortowania można zmienić.

Znajdowanie węzła głównego dla typu projektu

Gdy program Visual Studio przechodzi przez foldery ProjectTemplates, otwiera wszystkie pliki zip i wyodrębnia wszystkie pliki vstemplate. Plik vstemplate używa kodu XML do opisania szablonu aplikacji. Aby uzyskać więcej informacji, zobacz New Project Generation: Under the Hood, Part Two (Nowa generacja projektu: pod maską, część druga).

Tag <ProjectType> określa typ projektu dla aplikacji. Na przykład plik \CSharp\SmartDevice\WindowsCE\1033\WindowsCE-EmptyProject.zip zawiera plik EmptyProject.vstemplate zawierający następujący tag:

<ProjectType>CSharp</ProjectType>

Tag <ProjectType> , a nie podfolder w folderze ProjectTemplates, określa węzeł główny aplikacji w drzewie Typów projektów. W tym przykładzie aplikacje systemu Windows CE będą wyświetlane w węźle głównym visual C# , a nawet jeśli chcesz przenieść folder WindowsCE do folderu VisualBasic, aplikacje systemu Windows CE nadal będą wyświetlane w węźle głównym visual C# .

Lokalizowanie nazwy węzła

Gdy program Visual Studio przechodzi przez foldery ProjectTemplates, analizuje wszystkie znalezione pliki vstdir. Plik vstdir to plik XML, który kontroluje wygląd typu projektu w oknie dialogowym Nowy projekt . W pliku vstdir użyj tagu <LocalizedName> , aby nazwać węzeł Typy projektów.

Na przykład plik \CSharp\Database\TemplateIndex.vstdir zawiera następujący tag:

<LocalizedName Package="{462b036f-7349-4835-9e21-bec60e989b9c}" ID="4598"/>

Określa to satelitarną bibliotekę DLL i identyfikator zasobu zlokalizowanego ciągu, który w tym przypadku nazywa węzeł główny. W tym przypadku baza danych. Zlokalizowana nazwa może zawierać znaki specjalne, które nie są dostępne dla nazw folderów, takich jak .NET.

Jeśli nie <ma tagu LocalizedName>, typ projektu jest nazwany przez sam folder Smart Telefon 2003.

Znajdowanie kolejności sortowania dla typu projektu

Aby określić kolejność sortowania typu projektu, pliki vstdir używają tagu <SortOrder> .

Na przykład plik \CSharp\Windows\Windows.vstdir zawiera następujący tag:

<SortOrder>5</SortOrder>

Plik \CSharp\Database\TemplateIndex.vstdir ma tag o większej wartości:

<SortOrder>5000</SortOrder>

Im niższa liczba w tagu SortOrder>, tym wyższa pozycja w drzewie, więc węzeł systemu Windows jest wyświetlany wyżej niż węzeł Baza danych w drzewie Typy projektów.<

Jeśli nie <określono tagu SortOrder> dla typu projektu, jest on wyświetlany w kolejności alfabetycznej zgodnie z dowolnymi typami projektów, które zawierają <specyfikacje SortOrder> .

Należy pamiętać, że w folderach Moje dokumenty (moje szablony) nie ma plików vstdir. Nazwy typów projektów aplikacji użytkownika nie są zlokalizowane i są wyświetlane w kolejności alfabetycznej.

Szybka recenzja

Zmodyfikujmy okno dialogowe Nowy projekt i utwórzmy nowy szablon projektu użytkownika.

  1. Dodaj podfolder MyProjectNode do folderu \Program Files\Microsoft Visual Studio 14.0\Common7\IDE\ProjectTemplates\CSharp.

  2. Utwórz plik MyProject.vstdir w folderze MyProjectNode przy użyciu dowolnego edytora tekstu.

  3. Dodaj następujące wiersze do pliku vstdir:

    <TemplateDir Version="1.0.0">
        <SortOrder>6</SortOrder>
    </TemplateDir>
    
  4. Zapisz i zamknij plik vstdir.

  5. Utwórz plik MyProject.vstemplate w folderze MyProjectNode przy użyciu dowolnego edytora tekstów.

  6. Dodaj następujące wiersze do pliku vstemplate:

    <VSTemplate Version="2.0.0" Type="Project" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
        <TemplateData>
            <ProjectType>CSharp</ProjectType>
        </TemplateData>
    </VSTemplate>
    
  7. Zapisz plik vstemplate i zamknij edytor.

  8. Wyślij plik vstemplate do nowego skompresowanego folderu MyProjectNode\MyProject.zip.

  9. W oknie polecenia programu Visual Studio wpisz:

    devenv /installvstemplates
    

    Otwórz program Visual Studio.

  10. Otwórz okno dialogowe Nowy projekt i rozwiń węzeł projektu Visual C#.

    Screenshot of the Project types folder tree in the New Project dialog box with MyProjectNode highlighted under the expanded Visual C# project node.

    Węzeł MyProjectNode jest wyświetlany jako węzeł podrzędny języka Visual C# tuż pod węzłem systemu Windows.