Używanie kreatorów z szablonami projektów
Program Visual Studio udostępnia IWizard interfejs, który po zaimplementowaniu umożliwia uruchamianie kodu niestandardowego, gdy użytkownik tworzy projekt na podstawie szablonu.
Dostosowywanie szablonu projektu może służyć do wyświetlania niestandardowego interfejsu użytkownika, który zbiera dane wejściowe użytkownika w celu dostosowania szablonu, dodawania dodatkowych plików do szablonu lub dowolnej innej akcji dozwolonej w projekcie.
Metody interfejsu IWizard są wywoływane w różnych momentach podczas tworzenia projektu, począwszy od razu po kliknięciu przycisku OK w oknie dialogowym Nowy projekt. Każda metoda interfejsu ma nazwę , aby opisać punkt, w którym jest wywoływany. Na przykład program Visual Studio wywołuje wywołanie RunStarted natychmiast po rozpoczęciu tworzenia projektu, dzięki czemu jest to dobra lokalizacja do pisania kodu niestandardowego w celu zbierania danych wejściowych użytkownika.
Tworzenie projektu szablonu projektu przy użyciu projektu VSIX
Rozpoczynasz tworzenie szablonu niestandardowego przy użyciu projektu szablonu projektu, który jest częścią zestawu Visual Studio SDK. W tej procedurze użyjemy projektu szablonu projektu języka C#, ale istnieje również projekt szablonu projektu Języka Visual Basic. Następnie dodasz projekt VSIX do rozwiązania zawierającego projekt szablonu projektu.
Utwórz projekt szablonu projektu w języku C# (w programie Visual Studio wybierz pozycję Plik>nowy>projekt i wyszukaj ciąg "szablon projektu"). Nadaj mu nazwę MyProjectTemplate.
Uwaga
Może zostać wyświetlony monit o zainstalowanie zestawu Visual Studio SDK. Aby uzyskać więcej informacji, zobacz Instalowanie zestawu Visual Studio SDK.
Dodaj nowy projekt VSIX w tym samym rozwiązaniu co projekt szablonu projektu (w Eksplorator rozwiązań wybierz węzeł rozwiązania, kliknij prawym przyciskiem myszy i wybierz polecenie Dodaj>nowy projekt i wyszukaj ciąg "vsix"). Nadaj mu nazwę MyProjectWizard.
Ustaw projekt VSIX jako projekt startowy. W Eksplorator rozwiązań wybierz węzeł projektu VSIX, kliknij prawym przyciskiem myszy i wybierz pozycję Ustaw jako projekt startowy.
Dodaj projekt szablonu jako element zawartości projektu VSIX. W Eksplorator rozwiązań w węźle projektu VSIX znajdź plik source.extension.vsixmanifest. Kliknij go dwukrotnie, aby otworzyć go w edytorze manifestu.
W edytorze manifestu wybierz kartę Zasoby po lewej stronie okna.
Na karcie Zasoby wybierz pozycję Nowy. W oknie Dodawanie nowego zasobu w polu Typ wybierz pozycję Microsoft.VisualStudio.ProjectTemplate. W polu Źródło wybierz pozycję Projekt w bieżącym rozwiązaniu. W polu Projekt wybierz pozycję MyProjectTemplate. Następnie kliknij przycisk OK.
Skompiluj rozwiązanie i rozpocznij debugowanie. Zostanie wyświetlone drugie wystąpienie programu Visual Studio. (Może to potrwać kilka minut).
W drugim wystąpieniu programu Visual Studio spróbuj utworzyć nowy projekt przy użyciu nowego szablonu (Plik>nowy>projekt, wyszukaj ciąg "myproject"). Nowy projekt powinien zostać wyświetlony z klasą o nazwie Class1. Utworzono szablon projektu niestandardowego! Zatrzymaj debugowanie teraz.
Tworzenie kreatora szablonu niestandardowego
W tej procedurze pokazano, jak utworzyć kreatora niestandardowego, który otwiera formularz systemu Windows przed utworzeniem projektu. Formularz umożliwia użytkownikom dodawanie niestandardowej wartości parametru dodawanej do kodu źródłowego podczas tworzenia projektu.
Skonfiguruj projekt VSIX, aby umożliwić mu utworzenie zestawu.
W Eksplorator rozwiązań wybierz węzeł projektu VSIX. Poniżej Eksplorator rozwiązań powinno zostać wyświetlone okno Właściwości. Jeśli tego nie zrobisz, wybierz pozycję Wyświetl>okno właściwości lub naciśnij klawisz F4. W oknie Właściwości wybierz następujące pola:
true
Dołączanie zestawu w kontenerze VSIX
Dołączanie symboli debugowania w lokalnym wdrożeniu VSIX
Dołączanie symboli debugowania w kontenerze VSIX
Dodaj zestaw jako element zawartości do projektu VSIX. Otwórz plik source.extension.vsixmanifest i wybierz kartę Zasoby. W oknie Dodawanie nowego zasobu w polu Typ wybierz pozycję Microsoft.VisualStudio.Assembly w polu Źródło wybierz pozycję Projekt w bieżącym rozwiązaniu, a w polu Projekt wybierz pozycję MyProjectWizard.
Dodaj następujące odwołania do projektu VSIX. (W Eksplorator rozwiązań w węźle projektu VSIX wybierz pozycję Odwołania, kliknij prawym przyciskiem myszy i wybierz pozycję Dodaj odwołanie. W oknie dialogowym Dodawanie odwołania na karcie Struktura znajdź zestaw System.Windows Forms i wybierz go. Znajdź również i wybierz zestawy System i System.Drawing . Teraz wybierz kartę Rozszerzenia . Znajdź zestaw EnvDTE i wybierz go. Znajdź również zestaw Microsoft.VisualStudio.TemplateWizardInterface i wybierz go. Kliknij przycisk OK.
Dodaj klasę implementacji kreatora do projektu VSIX. (W Eksplorator rozwiązań kliknij prawym przyciskiem myszy węzeł projektu VSIX i wybierz polecenie Dodaj, a następnie pozycję Nowy element, a następnie pozycję Klasa. Nadaj klasie nazwę WizardImplementation.
Zastąp kod w pliku WizardImplementationClass.cs następującym kodem:
using System; using System.Collections.Generic; using Microsoft.VisualStudio.TemplateWizard; using System.Windows.Forms; using EnvDTE; namespace MyProjectWizard { public class WizardImplementation:IWizard { private UserInputForm inputForm; private string customMessage; // This method is called before opening any item that // has the OpenInEditor attribute. public void BeforeOpeningFile(ProjectItem projectItem) { } public void ProjectFinishedGenerating(Project project) { } // This method is only called for item templates, // not for project templates. public void ProjectItemFinishedGenerating(ProjectItem projectItem) { } // This method is called after the project is created. public void RunFinished() { } public void RunStarted(object automationObject, Dictionary<string, string> replacementsDictionary, WizardRunKind runKind, object[] customParams) { try { // Display a form to the user. The form collects // input for the custom message. inputForm = new UserInputForm(); inputForm.ShowDialog(); customMessage = UserInputForm.CustomMessage; // Add custom parameters. replacementsDictionary.Add("$custommessage$", customMessage); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } // This method is only called for item templates, // not for project templates. public bool ShouldAddProjectItem(string filePath) { return true; } } }
Element UserInputForm , do których odwołuje się ten kod, zostanie zaimplementowany później.
Klasa
WizardImplementation
zawiera implementacje metod dla każdego elementu członkowskiego IWizardklasy . W tym przykładzie RunStarted tylko metoda wykonuje zadanie. Wszystkie inne metody nie robią nic lub zwracają wartośćtrue
.Metoda RunStarted akceptuje cztery parametry:
Parametr Object , który można rzutować do obiektu głównego _DTE , aby umożliwić dostosowanie projektu.
Dictionary<TKey,TValue> Parametr zawierający kolekcję wszystkich wstępnie zdefiniowanych parametrów w szablonie. Aby uzyskać więcej informacji na temat parametrów szablonu, zobacz Parametry szablonu.
WizardRunKind Parametr zawierający informacje o rodzaju używanego szablonu.
Tablica zawierająca Object zestaw parametrów przekazywanych do kreatora przez program Visual Studio.
W tym przykładzie do parametru jest dodana wartość parametru z formularza wejściowego Dictionary<TKey,TValue> użytkownika. Każde wystąpienie parametru
$custommessage$
w projekcie zostanie zastąpione tekstem wprowadzonym przez użytkownika.
Teraz utwórz element UserInputForm. W pliku WizardImplementation.cs dodaj następujący kod po końcu
WizardImplementation
klasy.public partial class UserInputForm : Form { private static string customMessage; private TextBox textBox1; private Button button1; public UserInputForm() { this.Size = new System.Drawing.Size(155, 265); button1 = new Button(); button1.Location = new System.Drawing.Point(90, 25); button1.Size = new System.Drawing.Size(50, 25); button1.Click += button1_Click; this.Controls.Add(button1); textBox1 = new TextBox(); textBox1.Location = new System.Drawing.Point(10, 25); textBox1.Size = new System.Drawing.Size(70, 20); this.Controls.Add(textBox1); } public static string CustomMessage { get { return customMessage; } set { customMessage = value; } } private void button1_Click(object sender, EventArgs e) { customMessage = textBox1.Text; this.Close(); } }
Formularz wejściowy użytkownika zawiera prosty formularz do wprowadzania parametru niestandardowego. Formularz zawiera pole tekstowe o nazwie
textBox1
i przycisk o nazwiebutton1
. Po kliknięciu przycisku tekst z pola tekstowego jest przechowywany w parametrzecustomMessage
.
Połączenie kreatora do szablonu niestandardowego
Aby szablon projektu niestandardowego korzystał z kreatora niestandardowego, należy podpisać zestaw kreatora i dodać kilka wierszy do niestandardowego szablonu projektu, aby poinformować go, gdzie znaleźć implementację kreatora podczas tworzenia nowego projektu.
Podpisz zestaw. W Eksplorator rozwiązań wybierz projekt VSIX, kliknij prawym przyciskiem myszy i wybierz pozycję Właściwości projektu.
W oknie Właściwości projektu wybierz kartę Podpisywanie. Na karcie Podpisywanie zaznacz pole Wyboru Podpisz zestaw. W polu Wybierz plik klucza silnej nazwy wybierz pozycję <Nowy>. W oknie Tworzenie silnego klucza nazwy w polu Nazwa pliku klucza wpisz key.snk. Usuń zaznaczenie pola Chroń plik klucza przy użyciu hasła .
W Eksplorator rozwiązań wybierz projekt VSIX i znajdź okno Właściwości.
Ustaw pole Kopiuj dane wyjściowe kompilacji na Wartość Output Directory na wartość true. Dzięki temu zestaw może zostać skopiowany do katalogu wyjściowego podczas odbudowy rozwiązania. Jest on nadal zawarty
.vsix
w pliku. Aby dowiedzieć się, jak znaleźć jego klucz podpisywania, musisz zobaczyć zestaw.Skompiluj ponownie rozwiązanie.
Plik key.snk można teraz znaleźć w katalogu projektu MyProjectWizard (<lokalizacja> dysku\MyProjectTemplate\MyProjectWizard\key.snk). Skopiuj plik key.snk.
Przejdź do katalogu wyjściowego i znajdź zestaw (<lokalizację> dysku\MyProjectTemplate/MyProjectWizard\bin\Debug\MyProjectWizard.dll). Wklej tutaj plik key.snk . (To nie jest absolutnie konieczne, ale ułatwi to wykonanie poniższych kroków).
Otwórz okno polecenia i przejdź do katalogu, w którym utworzono zestaw.
Znajdź narzędzie podpisywania sn.exe . Na przykład w systemie operacyjnym Windows 10 64-bitowym typowa ścieżka będzie następująca:
C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools
Jeśli nie możesz znaleźć narzędzia, spróbuj uruchomić polecenie , gdzie /R . sn.exe w oknie polecenia. Zanotuj ścieżkę.
Wyodrębnij klucz publiczny z pliku key.snk . W oknie polecenia wpisz
<lokalizacja sn.exe\sn.exe> -p key.snk outfile.key.
Nie zapomnij otaczać ścieżką sn.exe znakami cudzysłowu, jeśli w nazwach katalogów znajdują się spacje!
Pobierz token klucza publicznego z pliku outfile:
<lokalizacja sn.exe\sn.exe> -t outfile.key.
Ponownie nie zapomnij o cudzysłowie. Powinien zostać wyświetlony wiersz w danych wyjściowych w następujący sposób
Token klucza publicznego to <token>
Zanotuj tę wartość.
Dodaj odwołanie do kreatora niestandardowego do pliku vstemplate szablonu projektu. W Eksplorator rozwiązań znajdź plik o nazwie MyProjectTemplate.vstemplate i otwórz go. Po zakończeniu <sekcji TemplateContent> dodaj następującą sekcję:
<WizardExtension> <Assembly>MyProjectWizard, Version=1.0.0.0, Culture=Neutral, PublicKeyToken=token</Assembly> <FullClassName>MyProjectWizard.WizardImplementation</FullClassName> </WizardExtension>
Gdzie MyProjectWizard jest nazwą zestawu, a token jest tokenem skopiowany w poprzednim kroku.
Zapisz wszystkie pliki w projekcie i ponownie skompiluj.
Dodawanie parametru niestandardowego do szablonu
W tym przykładzie projekt używany jako szablon wyświetla komunikat określony w formularzu wejściowym użytkownika kreatora niestandardowego.
W Eksplorator rozwiązań przejdź do projektu MyProjectTemplate i otwórz plik Class1.cs.
W metodzie
Main
aplikacji dodaj następujący wiersz kodu.Console.WriteLine("$custommessage$");
Parametr
$custommessage$
jest zastępowany tekstem wprowadzonym w formularzu wejściowym użytkownika podczas tworzenia projektu na podstawie szablonu.
Oto pełny plik kodu, który został wyeksportowany do szablonu.
using System;
using System.Collections.Generic;
$if$ ($targetframeworkversion$ >= 3.5)using System.Linq;
$endif$using System.Text;
namespace $safeprojectname$
{
public class Class1
{
static void Main(string[] args)
{
Console.WriteLine("$custommessage$");
}
}
}
Korzystanie z kreatora niestandardowego
Teraz możesz utworzyć projekt na podstawie szablonu i użyć kreatora niestandardowego.
Ponownie skompiluj rozwiązanie i rozpocznij debugowanie. Powinno zostać wyświetlone drugie wystąpienie programu Visual Studio.
Utwórz nowy projekt MyProjectTemplate. (Plik>nowy>projekt).
W oknie dialogowym Nowy projekt wyszukaj ciąg "myproject", aby zlokalizować szablon, wpisz nazwę i kliknij przycisk OK.
Zostanie otwarty formularz wejściowy użytkownika kreatora.
Wpisz wartość parametru niestandardowego i kliknij przycisk.
Formularz wejściowy użytkownika kreatora zostanie zamknięty, a projekt zostanie utworzony na podstawie szablonu.
W Eksplorator rozwiązań kliknij prawym przyciskiem myszy plik kodu źródłowego i kliknij polecenie Wyświetl kod.
Zwróć uwagę, że
$custommessage$
tekst wprowadzony w formularzu wprowadzania przez użytkownika kreatora został zastąpiony tekstem.