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


Развертывание пользовательского обработчика директив

Чтобы использовать настраиваемый обработчик директив в Visual Studio на любом компьютере, необходимо зарегистрировать его одним из методов, описанных в этом разделе.

Альтернативные методы таковы:

  • Расширения Visual Studio. Предоставляет способ установки и удаления процессора директив на вашем и других компьютерах. Обычно можно упаковывать другие функции в тот же VSIX.

  • VSPackage. Вы определяете VSPackage, содержащий помимо процессора директив и другие функции; это удобный метод регистрации процессора директив.

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

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

Развертывание процессора директив в VSIX

Вы можете добавить настраиваемый обработчик директив в расширение Visual Studio (VSIX).

Необходимо убедиться, что следующие два элемента содержатся в файле с расширением vsix:

  • Сборка (dll), содержащая класс пользовательского процессора директив.

  • Файл pkgdef, регистрирующий процессор директив. Корневое имя файла сборки должно совпадать с именем сборки. Например, файлы могут называться CDP.dll и CDP.pkgdef.

Чтобы просмотреть или изменить содержимое файла vsix, измените расширение его имени на zip и откройте этот файл. После изменения содержимого снова поменяйте расширение имени файла на vsix.

Файл vsix можно создать несколькими способами. Следующая процедура представляет один из них.

Разработка пользовательского процессора директив в проекте VSIX

  1. Создайте проект проекта VSIX.

  2. В source.extension.vsixmanifest задайте тип контента и поддерживаемые выпуски.

    1. В редакторе манифеста VSIX на вкладке "Активы" выберите "Создать " и задайте свойства нового элемента:

      Тип = контента VSPackage

      Исходный проект = <текущий проект>

    2. Щелкните выбранные выпуски и проверка типы установки, на которые вы хотите использовать процессор директив.

  3. Добавьте файл pkgdef и установит его свойства для включения в VSIX.

    1. Создайте текстовый файл и назовите его <assemblyName.pkgdef>.

      <Имя> сборки обычно совпадает с именем проекта.

    2. Выберите его в обозревателе решений и задайте его свойства следующим образом:

      Build Action = Content (Действие при сборке > Содержимое);

      Копирование в выходную копию каталога = Always

      Включение в VSIX = True

    3. Задайте имя VSIX и убедитесь, что этот идентификатор уникален.

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

    [$RootKey$\TextTemplating]
    [$RootKey$\TextTemplating\DirectiveProcessors]
    [$RootKey$\TextTemplating\DirectiveProcessors\ CustomDirectiveProcessorName]
    @="Custom Directive Processor description"
    "Class"="NamespaceName.ClassName"
    "CodeBase"="$PackageFolder$\AssemblyName.dll"
    

    Замените следующие имена собственными именами: CustomDirectiveProcessorName, NamespaceName, ClassName, AssemblyName.

  5. В проекте добавьте ссылки на следующее:

    • Microsoft.VisualStudio.TextTemplating.*.0

    • Microsoft.VisualStudio.TextTemplating.Interfaces.*.0

    • Microsoft.VisualStudio.TextTemplating.VSHost.*.0

  6. Добавьте в проект класс вашего пользовательского процессора директив.

    Это открытый класс, который должен реализовывать тип DirectiveProcessor или RequiresProvidesDirectiveProcessor.

Установка пользовательского процессора директив

  1. В Windows Обозреватель откройте каталог сборки (обычно bin\Debug или bin\Release).

  2. Если требуется установить процессор директив на другой компьютер, скопируйте vsix-файл на другой компьютер.

  3. Дважды щелкните vsix-файл. Откроется установщик расширений Visual Studio.

  4. Перезапустите Visual Studio. Теперь вы сможете запускать текстовые шаблоны, содержащие директивы со ссылками на ваш пользовательский процессор директив. Каждая директива имеет следующую форму:

    <#@ CustomDirective Processor="CustomDirectiveProcessorName" parameter1="value1" ... #>

Удаление или временное отключение пользовательского процессора директив

  1. В меню "Инструменты Visual Studio " щелкните "Диспетчер расширений".

  2. Выберите VSIX, содержащий обработчик директив, и нажмите кнопку "Удалить " или "Отключить".

Устранение неполадок процессора директив в VSIX

Если процессор директив не работает, этому могут быть следующие причины:

  • Имя процессора, заданное в пользовательской директиве, должно соответствовать значению CustomDirectiveProcessorName, заданному в pkgdef-файле.

  • Метод IsDirectiveSupported должен возвращать значение true, когда ему передается имя CustomDirective.

  • Если расширение не отображается в диспетчере расширений, но система не позволит установить его, удалите расширение из %localappdata%\Microsoft\VisualStudio\*.0\Extensions\.

  • Откройте vsix-файл и проверьте его содержимое. Чтобы его открыть, смените расширение имени файла на zip. Убедитесь, что он содержит файлы с расширениями dll, pkgdef и файл extension.vsixmanifest. Файл extension.vsixmanifest должен содержать соответствующий список в узле SupportedProducts, а также содержать узел VsPackage, расположенный в иерархии ниже узла Content.

    <Content>

    <VsPackage>CustomDirectiveProcessor.dll</VsPackage>

    </Content>

Развертывание процессора директив в VSPackage

Если процессор директив является частью VSPackage, который будет установлен в глобальный кэш сборок, можно сделать так, чтобы система сама сгенерировала pkgdef-файл.

Поместите в класс пакета следующий атрибут.

[ProvideDirectiveProcessor(typeof(DirectiveProcessorClass), "DirectiveProcessorName", "Directive processor description.")]

Примечание.

Этот атрибут следует поместить в класс пакета, не в класс процессора директив.

Файл pkgdef будет автоматически создан во время построения проекта. При установке VSPackage pkgdef-файл будет регистрировать процессор директив.

Убедитесь, что pkgdef-файл содержится в папке построения, которой обычно является bin\Debug или bin\Release. Если там нет этого файла, откройте CSPROJ-файл в текстовом редакторе и удалите следующий узел: <GeneratePkgDefFile>false</GeneratePkgDefFile>.

Дополнительные сведения см. в разделе VSPackages.

Создание раздела реестра

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

Внимание

Неправильное изменение реестра может вызвать серьезные проблемы. Перед внесением изменений в реестр необходимо выполнить резервное копирование всех ценных данных на компьютере.

Регистрация процессора директив путем создания раздела реестра

  1. Запустите regedit.

  2. В программе regedit перейдите следующему разделу:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\*.0\TextTemplating\DirectiveProcessors

    Если вы хотите установить процессор директив в экспериментальной версии Visual Studio, вставьте "Exp" после "11.0".

  3. Добавьте раздел реестра с именем, совпадающим с именем класса процессора директив.

    • В дереве реестра щелкните правой кнопкой мыши узел DirectiveProcessors , наведите указатель мыши на "Создать", а затем нажмите кнопку "Ключ".
  4. Добавьте в новый узел строковые значения для параметров Class и CodeBase либо Assembly согласно указаниям, приведенным в следующих таблицах.

    1. Щелкните правой кнопкой мыши созданный узел, наведите указатель на "Создать" и щелкните "Строковое значение".

    2. Отредактируйте имя значения.

    3. Дважды щелкните имя и отредактируйте данные.

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

Имя. Тип Data
(по умолчанию) REG_SZ (значение не задано)
Класс REG_SZ <Имя пространства имен>.<Имя класса>
CodeBase REG_SZ <Путь>\<имя сборки>

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

Имя. Тип Data
(по умолчанию) REG_SZ (значение не задано)
Класс REG_SZ <Полное имя класса>
Сборка REG_SZ <Имя сборки в GAC>