Przewodnik: łączenie hosta z wygenerowanym procesorem dyrektywy
Możesz napisać własnego hosta, który przetwarza szablony tekstu. Podstawowy host niestandardowy jest przedstawiony w przewodniku: Tworzenie niestandardowego hosta szablonu tekstu. Możesz rozszerzyć ten host, aby dodać funkcje, takie jak generowanie wielu plików wyjściowych.
W tym przewodniku rozszerzysz niestandardowy host tak, aby obsługiwał szablony tekstu wywołujące procesory dyrektywy. Podczas definiowania języka specyficznego dla domeny generuje procesor dyrektywy dla modelu domeny. Procesor dyrektywy ułatwia użytkownikom pisanie szablonów, które uzyskują dostęp do modelu, co zmniejsza konieczność pisania dyrektyw zestawów i importu w szablonach.
Uwaga
Ten przewodnik jest oparty na przewodniku: tworzenie niestandardowego hosta szablonu tekstowego. Najpierw wykonaj ten przewodnik.
Ten instruktaż zawiera następujące zagadnienia:
Używanie narzędzi językowych specyficznych dla domeny do generowania procesora dyrektywy opartego na modelu domeny.
Połączenie niestandardowego hosta szablonu tekstowego do wygenerowanego procesora dyrektywy.
Testowanie hosta niestandardowego za pomocą wygenerowanego procesora dyrektywy.
Wymagania wstępne
Aby zdefiniować rozszerzenie DSL, należy zainstalować następujące składniki:
Składnik | Link |
---|---|
Visual Studio | http://go.microsoft.com/fwlink/?LinkId=185579 |
Visual Studio SDK | http://go.microsoft.com/fwlink/?LinkId=185580 |
Visual Studio Visualization and Modeling SDK |
Uwaga
Składnik Przekształcanie szablonu tekstu jest automatycznie instalowany w ramach obciążenia programistycznego rozszerzenia programu Visual Studio. Można go również zainstalować na karcie Poszczególne składniki Instalator programu Visual Studio w kategorii Zestawy SDK, biblioteki i struktury. Zainstaluj składnik Zestawu SDK modelowania na karcie Poszczególne składniki.
Ponadto musisz mieć niestandardowe przekształcenie szablonu tekstowego utworzone w przewodniku: Tworzenie niestandardowego hosta szablonu tekstowego.
Generowanie procesora dyrektywy przy użyciu narzędzi językowych specyficznych dla domeny
W tym przewodniku użyjesz Kreatora Projektant języka specyficznego dla domeny, aby utworzyć język specyficzny dla domeny dla rozwiązania DSLMinimalTest.
Utwórz rozwiązanie języka specyficznego dla domeny, które ma następujące cechy:
Nazwa: DSLMinimalTest
Szablon rozwiązania: minimalny język
Rozszerzenie pliku: min
Nazwa firmy: Fabrikam
Aby uzyskać więcej informacji na temat tworzenia rozwiązania języka specyficznego dla domeny, zobacz How to: Create a Domain-Specific Language Solution (Jak utworzyć rozwiązanie języka specyficznego dla domeny).
W menu Kompilacja kliknij pozycję Kompiluj rozwiązanie.
Ważne
Ten krok generuje procesor dyrektywy i dodaje klucz do niego w rejestrze.
W menu Debugowanie kliknij polecenie Rozpocznij debugowanie.
Zostanie otwarte drugie wystąpienie programu Visual Studio.
W kompilacji eksperymentalnej w Eksplorator rozwiązań kliknij dwukrotnie plik sample.min.
Plik zostanie otwarty w projektancie. Zwróć uwagę, że model ma dwa elementy: ExampleElement1 i ExampleElement2 oraz łącze między nimi.
Zamknij drugie wystąpienie programu Visual Studio.
Zapisz rozwiązanie, a następnie zamknij Projektant języka specyficznego dla domeny.
Połączenie niestandardowego hosta szablonu tekstowego do procesora dyrektywy
Po wygenerowaniu procesora dyrektywy należy połączyć procesor dyrektywy i niestandardowy host szablonu tekstowego utworzony w przewodniku: Tworzenie niestandardowego hosta szablonu tekstowego.
Otwórz rozwiązanie CustomHost.
W menu Project (Projekt) kliknij pozycję Add Reference (Dodaj odwołanie).
Zostanie otwarte okno dialogowe Dodawanie odwołania z wyświetloną kartą .NET .
Dodaj następujące odwołania:
Microsoft.VisualStudio.Modeling.Sdk.11.0
Microsoft.VisualStudio.Modeling.Sdk.Diagrams.11.0
Microsoft.VisualStudio.TextTemplating.11.0
Microsoft.VisualStudio.TextTemplating.Interfaces.11.0
Microsoft.VisualStudio.TextTemplating.Modeling.11.0
Microsoft.VisualStudio.TextTemplating.VSHost.11.0
W górnej części pliku Program.cs lub Module1.vb dodaj następujący wiersz kodu:
Znajdź kod właściwości
StandardAssemblyReferences
i zastąp go następującym kodem:Uwaga
W tym kroku dodasz odwołania do zestawów wymaganych przez wygenerowany procesor dyrektywy, który będzie obsługiwał host.
//the host can provide standard assembly references //the engine will use these references when compiling and //executing the generated transformation class //-------------------------------------------------------------- public IList<string> StandardAssemblyReferences { get { return new string[] { //if this host searches standard paths and the GAC //we can specify the assembly name like this: //"System" //since this host only resolves assemblies from the //fully qualified path and name of the assembly //this is a quick way to get the code to give us the //fully qualified path and name of the System assembly //--------------------------------------------------------- typeof(System.Uri).Assembly.Location, typeof(System.Uri).Assembly.Location, typeof(Microsoft.VisualStudio.Modeling.ModelElement).Assembly.Location, typeof(Microsoft.VisualStudio.Modeling.Diagrams.BinaryLinkShape).Assembly.Location, typeof(Microsoft.VisualStudio.TextTemplating.VSHost.ITextTemplating).Assembly.Location, typeof(Microsoft.VisualStudio.TextTemplating.VSHost.ModelingTextTransformation).Assembly.Location }; } }
Znajdź kod funkcji
ResolveDirectiveProcessor
i zastąp go następującym kodem:Ważne
Ten kod zawiera trwale zakodowane odwołania do nazwy wygenerowanego procesora dyrektywy, z którym chcesz nawiązać połączenie. Można łatwo uczynić to bardziej ogólnym, w takim przypadku szuka wszystkich procesorów dyrektywy wymienionych w rejestrze i próbuje znaleźć dopasowanie. W takim przypadku host będzie działał z dowolnym wygenerowanymi procesorami dyrektywy.
//the engine calls this method based on the directives the user has //specified it in the text template //this method can be called 0, 1, or more times //--------------------------------------------------------------------- public Type ResolveDirectiveProcessor(string processorName) { //check the processor name, and if it is the name of the processor the //host wants to support, return the type of the processor //--------------------------------------------------------------------- if (string.Compare(processorName, "DSLMinimalTestDirectiveProcessor", StringComparison.InvariantCultureIgnoreCase) == 0) { try { string keyName = @"Software\Microsoft\VisualStudio\10.0Exp_Config\TextTemplating\DirectiveProcessors\DSLMinimalTestDirectiveProcessor"; using (RegistryKey specificKey = Registry.CurrentUser.OpenSubKey(keyName)) { if (specificKey != null) { List<string> names = new List<String>(specificKey.GetValueNames()); string classValue = specificKey.GetValue("Class") as string; if (!string.IsNullOrEmpty(classValue)) { string loadValue = string.Empty; System.Reflection.Assembly processorAssembly = null; if (names.Contains("Assembly")) { loadValue = specificKey.GetValue("Assembly") as string; if (!string.IsNullOrEmpty(loadValue)) { //the assembly must be installed in the GAC processorAssembly = System.Reflection.Assembly.Load(loadValue); } } else if (names.Contains("CodeBase")) { loadValue = specificKey.GetValue("CodeBase") as string; if (!string.IsNullOrEmpty(loadValue)) { //loading local assembly processorAssembly = System.Reflection.Assembly.LoadFrom(loadValue); } } if (processorAssembly == null) { throw new Exception("Directive Processor not found"); } Type processorType = processorAssembly.GetType(classValue); if (processorType == null) { throw new Exception("Directive Processor not found"); } return processorType; } } } } catch (Exception e) { //if the directive processor can not be found, throw an error throw new Exception("Directive Processor not found"); } } //if the directive processor is not one this host wants to support throw new Exception("Directive Processor not supported"); }
W menu File kliknij pozycję Save All.
W menu Kompilacja kliknij pozycję Kompiluj rozwiązanie.
Testowanie hosta niestandardowego za pomocą procesora dyrektywy
Aby przetestować niestandardowy host szablonu tekstowego, najpierw musisz napisać szablon tekstowy, który wywołuje wygenerowany procesor dyrektywy. Następnie uruchomisz hosta niestandardowego, przekaż do niego nazwę szablonu tekstowego i sprawdź, czy dyrektywa jest przetwarzana poprawnie.
Tworzenie szablonu tekstowego do testowania hosta niestandardowego
Utwórz plik tekstowy i nadaj mu
TestTemplateWithDP.tt
nazwę . Do utworzenia pliku można użyć dowolnego edytora tekstów, takiego jak Notatnik.Dodaj następującą zawartość do pliku tekstowego:
Uwaga
Język programowania szablonu tekstu nie musi być zgodny z językiem niestandardowym hosta.
Text Template Host Test <#@ template debug="true" inherits="Microsoft.VisualStudio.TextTemplating.VSHost.ModelingTextTransformation" #> <# //this is the call to the examplemodel directive in the generated directive processor #> <#@ DSLMinimalTest processor="DSLMinimalTestDirectiveProcessor" requires="fileName='<Your Path>\Sample.min'" provides="ExampleModel=ExampleModel" #> <# //uncomment this line to test that the host allows the engine to set the extension #> <# //@ output extension=".htm" #> <# //uncomment this line if you want to see the generated transformation class #> <# //System.Diagnostics.Debugger.Break(); #> <# //this code uses the results of the examplemodel directive #> <# foreach ( ExampleElement box in this.ExampleModel.Elements ) { WriteLine("Box: {0}", box.Name); foreach (ExampleElement linkedTo in box.Targets) { WriteLine("Linked to: {0}", linkedTo.Name); } foreach (ExampleElement linkedFrom in box.Sources) { WriteLine("Linked from: {0}", linkedFrom.Name); } WriteLine(""); } #>
W kodzie zastąp <ciąg YOUR PATH> ścieżką pliku Sample.min z języka specyficznego dla projektu utworzonego w pierwszej procedurze.
Zapisz i zamknij plik.
Testowanie hosta niestandardowego
Otwórz wiersz polecenia.
Wpisz ścieżkę pliku wykonywalnego dla niestandardowego hosta, ale nie naciskaj jeszcze ENTER.
Na przykład wpisz:
<YOUR PATH>CustomHost\bin\Debug\CustomHost.exe
Uwaga
Zamiast wpisywać adres, możesz przejść do pliku CustomHost.exe w Eksploratorze Windows, a następnie przeciągnąć plik do okna wiersza polecenia.
Wpisz spację.
Wpisz ścieżkę do pliku szablonu tekstu, a następnie naciśnij ENTER.
Na przykład wpisz:
<YOUR PATH>TestTemplateWithDP.txt
Uwaga
Zamiast wpisywać adres, możesz przejść do pliku TestTemplateWithDP.txt w Eksploratorze Windows, a następnie przeciągnąć plik do okna wiersza polecenia.
Aplikacja niestandardowego hosta jest uruchamiana i uruchamia proces przekształcania szablonu tekstu.
W Eksploratorze Windows przejdź do folderu zawierającego plik TestTemplateWithDP.txt.
Folder zawiera również plik TestTemplateWithDP1.txt.
Otwórz ten plik, aby zobaczyć wyniki przekształcenia szablonu tekstu.
Wyniki wygenerowanego tekstu wyjściowego są wyświetlane i powinny wyglądać następująco:
Text Template Host Test Box: ExampleElement1 Linked to: ExampleElement2 Box: ExampleElement2 Linked from: ExampleElement1