Поделиться через


Пошаговое руководство. Связывание основного приложения с генерируемым обработчиком директив

Можно написать собственный узел этому процессы текстовые шаблоны.Основное пользовательское основное приложение показано in Пошаговое руководство. Создание пользовательского хост-класса для текстовых шаблонов.Можно расширить то узел для добавления функций, как создавать несколько выходных файлов.

В этом пошаговом руководстве развернуть пользовательское основное приложение, чтобы оно будет поддерживать текстовые шаблоны, которые вызывают процессоры директив.При указании доменный язык, он создает a процессор директив для модели домена.Процессор директив облегчает пользователям создавать шаблоны, которые осуществляют доступ к модели, уменьшая необходимость записи в шаблонах директивы сборки и импорта.

Предупреждающее замечаниеВнимание

Построение данного пошагового руководства on Пошаговое руководство. Создание пользовательского хост-класса для текстовых шаблонов.Выполните то первое пошаговое руководство.

Данное пошаговое руководство содержит следующие задачи:

  • Использование Инструменты DSL создание процессор директив, который основан на модели домена.

  • Для подключения пользовательского основного приложения для текстовых шаблонов к созданному процессора директив.

  • Тестирование пользовательского основного приложения с созданным процессором директив.

Обязательные компоненты

Чтобы определить DSL, необходимо установить следующие компоненты:

Visual Studio

https://go.microsoft.com/fwlink/?LinkId=185579

SDK для Visual Studio

https://go.microsoft.com/fwlink/?LinkId=185580

Пакет SDK для визуализации данных и моделирования Visual Studio

https://go.microsoft.com/fwlink/?LinkID=186128

Кроме того, необходимо иметь пользовательское преобразование текстового шаблона должен быть создан в пределах Пошаговое руководство. Создание пользовательского хост-класса для текстовых шаблонов.

С помощью доменного языка для создания процессора директив

В этом пошаговом руководстве используется мастер конструктора доменного языка, чтобы создать доменный язык для решения DSLMinimalTest.

Использование средств доменного языка для создания процессор директив, который основан на модели домена

  1. Создайте решение доменного языка, который имеет следующие характеристики:

    • Имя: DSLMinimalTest

    • Шаблон решения: Минимальный язык

    • Расширение файла: min

    • Название компании. Fabrikam

    Дополнительные сведения о создании решения доменного языка см. в разделе Практическое руководство. Создание решения на доменном языке.

  2. В меню Построение выберите Построить решение.

    Важное примечаниеВажно

    Этот шаг создает процессора директив и добавляет ключ для его в реестре.

  3. В меню Отладка щелкните Начать отладку.

    Второй экземпляр Visual Studio открытые.

  4. В экспериментальном построении in Обозреватель решенийдважды щелкните файл sample.min.

    Открытие файла в конструкторе.Обратите внимание, что модель содержит 2 элементов, ExampleElement1 и ExampleElement2 и связи между ними.

  5. Закройте второй экземпляр Visual Studio. 

  6. Сохраните решение, а затем закройте конструктор доменного языка.

Для подключения пользовательского основного приложения для текстовых шаблонов процессора директив

После создания процессор директив, подключении процессора директив и пользовательского основного приложения для текстовых шаблонов, созданный в пределах Пошаговое руководство. Создание пользовательского хост-класса для текстовых шаблонов.

Для подключения пользовательского основного приложения для текстовых шаблонов к созданному процессором директив

  1. Откройте решение CustomHost.

  2. В меню Проект щелкните команду Добавить ссылку.

    Добавление ссылки будет открыто диалоговое окно с .NET отображаемая на вкладку.

  3. Добавьте следующие ссылки:

    • 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

  4. В начало Program.cs или Module1.vb добавьте следующую строку кода:

    using Microsoft.Win32;
    
    Imports Microsoft.Win32
    
  5. Найдите код для свойства StandardAssemblyReferencesи замените его следующим кодом:

    ПримечаниеПримечание

    На этом шаге необходимо добавить ссылки на сборки, необходимые для созданным процессором директив, что основное приложение будет поддерживать.

    //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
    
            };
        }
    }
    
  6. Найдите код для функции ResolveDirectiveProcessorи замените его следующим кодом:

    Важное примечаниеВажно

    Этот код содержит жестко запрограммированные ссылки на имя создаваемого процессора директив, к которому нужно подключиться.Можно легко сделать это общее в этом случае он ищет все процессоры директив, перечисленные в реестре и пытается найти совпадения.В этом случае основное приложение работает с любым создаваемым процессором директив.

    //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");
            }
    
  7. В меню Файл выберите команду Сохранить все.

  8. В меню Построение выберите Построить решение.

Тестирование пользовательского основного приложения с процессором директив

Чтобы тестирование пользовательского основного приложения для текстовых шаблонов, сначала необходимо записать текстовый шаблон, который вызывает созданный процессор директив.Затем можно выполнить пользовательское основное приложение, передайте ему имя текстового шаблона, и тестирования, что директива обрабатывается неправильно.

Создание текстового шаблона для тестирования пользовательского основного приложения

  1. Создайте текстовый файл с именем TestTemplateWithDP.tt.Можно использовать любой текстовый редактор, например в " блокнот ", чтобы создать файл.

  2. Добавьте в текстовый файл следующий текст:

    ПримечаниеПримечание

    Языку программирования текстового шаблона не обязательно должны совпадать с пользовательского основного приложения.

    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("");
        } 
    #>
    
    Text Template Host Test
    
    <#@ template debug="true" language="VB" 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 #>
    
    <#    
       For Each box as ExampleElement In Me.ExampleModel.Elements 
    
           WriteLine("Box: {0}", box.Name)
    
            For Each LinkedTo as ExampleElement In box.Targets
                WriteLine("Linked to: {0}", LinkedTo.Name)
            Next
    
            For Each LinkedFrom as ExampleElement In box.Sources
                WriteLine("Linked from: {0}", LinkedFrom.Name)
            Next
    
            WriteLine("")
    
       Next 
    #>
    
  3. В программном коде замените <ПУТЬ> с помощью файла Sample.min от языка DGN-специфического созданный в первой процедуре.

  4. Сохраните и закройте файл.

Тестирование пользовательского основного приложения

  1. Откройте окно командной строки.

  2. Введите путь к исполняемому файлу пользовательского основного приложения, но пока не нажимайте клавишу ВВОД.

    Например, введите:

    <YOUR PATH>CustomHost\bin\Debug\CustomHost.exe

    ПримечаниеПримечание

    Вместо того, чтобы вводить адрес, можно найти файл CustomHost.exe в пределах Проводник Windows, а затем перетащите его в окно командной строки.

  3. Введите пробел.

  4. Введите путь к файлу текстового шаблона и нажмите клавишу ВВОД.

    Например, введите:

    <YOUR PATH>TestTemplateWithDP.txt

    ПримечаниеПримечание

    Вместо того, чтобы вводить адрес, можно найти файл TestTemplateWithDP.txt в пределах Проводник Windows, а затем перетащите его в окно командной строки.

    Пользовательское ведущее приложение запускается и запускает процесс преобразования текстового шаблона.

  5. IN Проводник Windowsперейдите к папке, содержащей файл TestTemplateWithDP.txt.

    Папка также содержится файл TestTemplateWithDP1.txt.

  6. Откройте этот файл, чтобы увидеть результаты преобразования текстового шаблона.

    Результаты сформированного вывода текста отображаются и может выглядеть следующим образом:

    Text Template Host Test
    
    
    Box: ExampleElement1
    Linked to: ExampleElement2
    
    Box: ExampleElement2
    Linked from: ExampleElement1
    

См. также

Задачи

Пошаговое руководство. Создание пользовательского хост-класса для текстовых шаблонов