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


Интеграция моделей с помощью Visual Studio ModelBus

Visual Studio ModelBus предоставляет метод создания связей между моделями и другими инструментами в модели. Например, можно связать модели языка для конкретного домена (DSL) и модели UML. или создать интегрированный набор DSL.

Предупреждение

Расширение Visual Studio ModelBus, описанное в этой статье, больше не доступно для скачивания. Однако эти инструкции по-прежнему работают для тех пользователей, у которых уже установлено это расширение.

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

Примечание.

В текущей реализации Visual Studio ModelBus связанные модели должны быть элементами в одном решении Visual Studio.

Дополнительные сведения о расширении ModelBus см. в следующих ресурсах:

Примечание.

Компонент Text Template Transformation (Преобразование текстовых шаблонов) автоматически устанавливается как часть рабочей нагрузки разработки расширений Visual Studio. Его также можно установить на вкладке Отдельные компоненты Visual Studio Installer в категории Пакеты SDK, библиотеки и платформы. Установите компонент Пакет SDK для моделирования со вкладки Отдельные компоненты.

Предоставление доступа к DSL

Прежде чем создавать ссылки ModelBus на модель или его элементы, определите модельBusAdapter для DSL. Самый простой способ определить его — использовать расширение Visual Studio ModelBus, которое добавляет команды в конструктор DSL.

Предоставление определения DSL в ModelBus

  1. Откройте файл определения DSL. Щелкните правой кнопкой мыши область конструктора и выберите "Включить ModelBus".

  2. В диалоговом окне выберите , чтобы предоставить этот DSL для ModelBus. Если вы хотите, чтобы DSL предоставил свои модели и использовал ссылки на другие DSL, выберите оба параметра.

  3. Нажмите ОК. Новый проект ModelBusAdapter добавляется в решение DSL.

  4. Если вы хотите получить доступ к DSL из текстового шаблона, необходимо изменить AdapterManager.tt в новом проекте. Пропустите этот шаг, если доступ к DSL необходимо получить из другого кода, например из обработчика команд и событий. Дополнительные сведения см. в разделе "Использование Visual Studio ModelBus" в текстовом шаблоне.

    1. Измените базовый AdapterManagerBase класс на VsTextTemplatingModelingAdapterManager.

    2. В конце файла вставьте этот атрибут перед классом AdapterManager:

      [Microsoft.VisualStudio.Modeling.Integration.HostSpecific(HostName)]

    3. В диспетчер пакетов ModelBusAdapter проекта NuGet добавьте в файл NuGet PackageReferenceMicrosoft.VisualStudio.TextTemplating.Modeling.

      Если доступ к DSL должен предоставляться как из текстовых шаблонов, так и из другого кода, необходимо указать два адаптера — один измененный и один неизмененный.

  5. Выберите "Преобразовать все шаблоны".

  6. Заново постройте решение.

    ModelBus теперь может открывать экземпляры этого DSL.

    Папка ModelBusAdapters\bin* содержит сборки, созданные проектом Dsl и проектомModelBusAdapters. Чтобы ссылаться на этот DSL из другого DSL, импортируйте эти сборки.

Убедитесь, что на элементы можно ссылаться

По умолчанию адаптеры Visual Studio ModelBus используют GUID элемента для его идентификации. Эти идентификаторы должны сохраняться в файле модели.

Чтобы убедиться, что идентификаторы элементов сохраняются:

  1. Откройте dslDefinition.dsl.

  2. В Обозреватель DSL разверните поведение сериализации XML, а затем классные данные.

  3. Для каждого класса, на который требуется создать ссылки ModelBus:

    Выберите узел класса и в окне "Свойства " убедитесь, что для параметра Serialize ID задано значение true.

Кроме того, если вы хотите использовать имена элементов для идентификации элементов вместо идентификаторов GUID, можно переопределить части созданных адаптеров. Переопределите следующие методы в классе адаптера.

  • Метод GetElementId, чтобы вернуть необходимый для использования идентификатор. Этот метод вызывается при создании ссылок.
  • Переопределите ResolveElementReference , чтобы найти правильный элемент из ссылки ModelBus.

Доступ к DSL из другого DSL

Ссылки ModelBus можно хранить в доменном свойстве в DSL и писать пользовательский код, использующий их. Вы также можете разрешить пользователю создать ссылку ModelBus, выбрав файл модели и элемент внутри него.

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

Предоставление DSL возможности получать ссылки на предоставляемый DSL

  1. На схеме определения DSL щелкните правой кнопкой мыши основную часть схемы и выберите "Включить ModelBus".

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

  3. Dsl В проекте используемого DSL добавьте следующие сборки в ссылки на проект. Эти сборки (.dll файлы) находятся в каталоге ModelBusAdapter\bin\* предоставленного DSL.

    • Предоставленная сборка DSL, например Fabrikam.FamilyTree.Dsl.dll

    • Сборка адаптера шины модели, например Fabrikam.FamilyTree.ModelBusAdapter.dll

  4. Добавьте следующие сборки платформы .NET к ссылкам проекта получающего DSL:

    • Microsoft.VisualStudio.Modeling.Sdk.Integration.dll
    • Microsoft.VisualStudio.Modeling.Sdk.Integration.Shell.dll

Хранение ModelBusReference в свойстве домена

  1. В схеме "Определение DSL" принимающего DSL добавьте к классу домена свойство домена и присвойте ему имя.

  2. В окне "Свойства" с выбранным свойством домена задайте для ModelBusReferenceпараметра "Тип".

    На этом этапе код программы может задать значение свойства. Значение доступно только для чтения в окне свойств .

    Вы можете разрешить пользователям задать свойство с помощью специализированного редактора ModelBusReference. Существует две версии этого редактора или средства выбора. Один позволяет пользователям выбирать файл модели, а другой позволяет пользователям выбирать файл модели и элемент в модели.

Разрешение пользователю задать ModelBusReference в свойстве домена

  1. Щелкните правой кнопкой мыши свойство домена и выберите "Изменить modelBusReference". Откроется диалоговое окно выбора шины модели.

  2. Задайте для модели соответствующий тип ModelBusReference или элемент внутри модели.

  3. В строке фильтра диалогового окна выбора файла введите строку вида Family Tree files |*.ftree. Замените расширение файла предоставленного DSL.

  4. Если вы решили ссылаться на элемент в модели, можно добавить список типов, которые пользователь может выбрать, например Company.FamilyTree.Person.

  5. Нажмите кнопку "ОК", а затем выберите "Преобразовать все шаблоны" на панели инструментов Обозреватель решений.

    Предупреждение

    Если вы не выбрали допустимую модель или сущность, кнопка "ОК" не действует, даже если она может появиться включена.

  6. Если вы указали список целевых типов, например Company.FamilyTree.Person, необходимо добавить ссылку на сборку в проект DSL, ссылаясь на библиотеку DLL целевого DSL, например Company.FamilyTree.Dsl.dll.

Тестирование ModelBusReference

  1. Постройте предоставляемый и принимающий DSL.

  2. Запустите один из dsLs в экспериментальном режиме, нажав клавишу F5 или CTRL+F5.

  3. В проекте отладки в экспериментальном экземпляре Visual Studio добавьте файлы, которые являются экземплярами каждого DSL.

    Примечание.

    Visual Studio ModelBus может разрешать только ссылки на модели, которые являются элементами в одном решении Visual Studio. Например, создать ссылку на файл модели, расположенный в другой части файловой системы, нельзя.

  4. Создайте и сохраните несколько элементов и связей в экземпляре предоставляемого DSL.

  5. Откройте экземпляр принимающего DSL и выберите элемент модели, имеющий свойство ссылки ModelBus.

  6. В окне свойств дважды щелкните эталонное свойство шины модели. Откроется диалоговое окно выбора.

  7. Выберите "Обзор " и выберите экземпляр предоставленного DSL.

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

Создание ссылок в коде программы

Если вы хотите сохранить ссылку на модель или элемент внутри модели, создайте объект ModelBusReference. Существует два вида объектов ModelBusReference: ссылки на модель и ссылки на элемент.

Чтобы создать ссылку на модель, вам потребуется адаптерManager DSL, в котором модель является экземпляром, а также имя файла или элемент проекта Visual Studio модели.

Для создания ссылки на элемент требуется адаптер для файла модели и элемент, на который необходимо сослаться.

Примечание.

С помощью Visual Studio ModelBus можно создавать ссылки только на элементы в одном решении Visual Studio.

Импорт предоставляемых сборок DSL

В потребляемом проекте добавьте ссылки на проекты к DSL и ModelBusAdapter сборкам предоставленного DSL.

Например, предположим, что вы хотите хранить ссылки ModelBus в элементах DSL MusicLibrary. Ссылки ModelBus ссылаются на элементы DSL FamilyTree. В узле "Ссылки" в Dsl проекте решения MusicLibrary добавьте ссылки на следующие сборки:

  • Fabrikam.FamilyTree.Dsl.dll. Предоставленный DSL.

  • Fabrikam.FamilyTree.ModelBusAdapters.dll адаптер ModelBus предоставленного DSL.

  • Microsoft.VisualStudio.Modeling.Sdk.Integration

  • Microsoft.VisualStudio.Modeling.Sdk.Integration.Shell

    Эти сборки можно найти в ModelBusAdapters проекте предоставленного DSL в разделе *bin\**.

    В файле кода, в котором создаются ссылки, обычно необходимо импортировать эти пространства имен:

// The namespace of the DSL you want to reference:
using Fabrikam.FamilyTree;  // Exposed DSL
using Fabrikam.FamilyTree.ModelBusAdapters;
using Microsoft.VisualStudio.Modeling.Integration;
using System.Linq;
...

Создание ссылки на модель

Чтобы создать ссылку на модель, необходимо получить сначала доступ к AdapterManager для предоставляемого DSL, а затем использовать его для создания ссылки на модель. Можно указать путь к файлу или .EnvDTE.ProjectItem

Из AdapterManager можно получить адаптер, который предоставляет доступ к отдельным элементам в модели.

Примечание.

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

// The file path of a model instance of the FamilyTree DSL:
string targetModelFile = "TudorFamilyTree.ftree";
// Get the ModelBus service:
IModelBus modelBus =
    this.Store.GetService(typeof(SModelBus)) as IModelBus;
// Get an adapterManager for the target DSL:
FamilyTreeAdapterManager manager =
    (modelbus.GetAdapterManager(FamilyTreeAdapter.AdapterId)
     as FamilyTreeAdapterManager;
// or: (modelBus.FindAdapterManagers(targetModelFile).First())
// or could provide an EnvDTE.ProjectItem

// Create a reference to the target model:
// NOTE: the target model must be a file in this project.
ModelBusReference modelReference =
     manager.CreateReference(targetModelFile);
// or can use an EnvDTE.ProjectItem instead of the filename

// Get the root element of this model:
using (FamilyTreeAdapter adapter =
     modelBus.CreateAdapter(modelReference) as FamilyTreeAdapter)
{
  FamilyTree modelRoot = adapter.ModelRoot;
  // Access elements under the root in the usual way:
  foreach (Person p in modelRoot.Persons) {...}
  // You can create adapters for individual elements:
  ModelBusReference elementReference =
     adapter.GetElementReference(person);
  ...
} // Dispose adapter

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

using Transaction t = this.Store.TransactionManager
    .BeginTransaction("keep reference"))
{
  artist.FamilyTreeReference = modelReference;
  t.Commit();
}

Чтобы разрешить пользователям изменять это свойство домена, используйте ModelReferenceEditor в качестве параметра в атрибуте Editor . Дополнительные сведения см. в разделе "Разрешить пользователю изменять ссылку".

Создание ссылки на элемент

Созданный для модели адаптер можно использовать для создания и разрешения ссылок.

// person is an element in the FamilyTree model:
ModelBusReference personReference =
  adapter.GetElementReference(person);

Чтобы elementReference можно было использовать позднее, ее можно сохранить в свойстве домена, имеющем ссылку ModelBusReference внешнего типа: Чтобы разрешить пользователям изменять его, используйте ModelElementReferenceEditor его в качестве параметра в атрибуте Editor . Дополнительные сведения см. в разделе "Разрешить пользователю изменять ссылку".

Разрешение ссылок

Наличие ссылки ModelBusReference (MBR) позволяет получить модель или элемент модели, к которой она относится. Если элемент представлен на схеме или в другом представлении, откройте это представление и выберите нужный элемент.

Из MBR можно создать адаптер. Из адаптера можно получить корень модели. Также можно разрешить MBR, ссылающиеся на определенные элементы внутри модели.

using Microsoft.VisualStudio.Modeling.Integration; ...
ModelBusReference elementReference = ...;

// Get the ModelBus service:
IModelBus modelBus =
    this.Store.GetService(typeof(SModelBus)) as IModelBus;
// Use a model reference or an element reference
// to obtain an adapter for the target model:
using (FamilyTreeAdapter adapter =
   modelBus.CreateAdapter(elementReference) as FamilyTreeAdapter)
   // or CreateAdapter(modelReference)
{
  // Get the root of the model:
  FamilyTree tree = adapter.ModelRoot;

  // Get a model element:
  MyDomainClass mel =
    adapter.ResolveElementReference<MyDomainClass>(elementReference);
  if (mel != null) {...}

  // Get the diagram or other view, if there is one:
  ModelBusView view = adapter.GetDefaultView();
  if (view != null)
  {
   view.Open();
   // Display the diagram:
   view.Show();
   // Attempt to select the shape that presents the element:
   view.SetSelection(elementReference);
  }
} // Dispose the adapter.

Разрешение ModelBusReferences в текстовом шаблоне

DSL, к которому необходимо получить доступ, должен иметь адаптер ModelBus, настроенный с помощью текстовых шаблонов на получение доступа. Дополнительные сведения см. в разделе "Предоставление доступа к DSL".

Как правило, вы обращаетесь к целевому DSL с помощью справочника по шине модели (МБ R), хранящейся в исходном DSL. В связи с этим шаблон включает директиву исходного DSL и код, необходимый для разрешения MBR. Дополнительные сведения о текстовых шаблонах см. в разделе "Создание кода на основе конкретного домена".

<#@ template debug="true" hostspecific="true"
inherits="Microsoft.VisualStudio.TextTemplating.Modeling.ModelBusEnabledTextTransformation" #>
<#@ SourceDsl processor="SourceDslDirectiveProcessor" requires="fileName='Sample.source'" #>
<#@ output extension=".txt" #>
<#@ assembly name = "Microsoft.VisualStudio.Modeling.Sdk.Integration.11.0" #>
<#@ assembly name = "System.Core" #>
<#@ assembly name = "Company.CompartmentDragDrop.Dsl.dll" #>
<#@ assembly name = "Company.CompartmentDragDrop.ModelBusAdapter.dll" #>
<#@ import namespace="Microsoft.VisualStudio.Modeling.Integration" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="Company.CompartmentDragDrop" #>
<#@ import namespace="Company.CompartmentDragDrop.ModelBusAdapters" #>
<# // Get source root from directive processor:
  ExampleModel source = this.ExampleModel;
  // This DSL has an MBR in its root:
using (ModelBusAdapter adapter = this.ModelBus.CreateAdapter(source.ModelReference) as ModelBusAdapter)
  {
  ModelBusAdapterManager manager = this.ModelBus.FindAdapterManagers(this.Host.ResolvePath("Sample.compDD1")).FirstOrDefault();
  ModelBusReference modelReference =
    manager.CreateReference(this.Host.ResolvePath("Sample.compDD1"));

  // Get the root element of this model:
  using (CompartmentDragDropAdapter adapter =
     this.ModelBus.CreateAdapter(modelReference) as CompartmentDragDropAdapter)
  {
    ModelRoot root = adapter.ModelRoot;
#>
[[<#= root.Name #>]]
<#
  }
#>

Дополнительные сведения и пошаговое руководство по использованию Visual Studio ModelBus в текстовом шаблоне

Сериализация ModelBusReference

Если ModelBusReference (MBR) необходимо сохранить в виде строки, ее можно сериализовать:

string serialized = modelBus.SerializeReference(elementReference);
// Store it anywhere, then get it back again:
ModelBusReference elementReferenceRestored =
    modelBus.DeserializeReference(serialized, null);

МБ R, сериализованный таким образом, не зависит от контекста. Если вы используете простой адаптер шины модели на основе файлов, МБ R содержит абсолютный путь к файлу. Если файлы модели экземпляра никогда не перемещаются, эта сериализация достаточно. Однако файлы модели обычно являются элементами проекта Visual Studio. Пользователи ожидают, что смогут переместить весь проект в разные части файловой системы. Они также ожидают, что он сможет держать проект под управлением версиями и открывать его на разных компьютерах. В связи с этим пути следует сериализовать относительно расположения проекта, содержащего файлы.

Сериализация относительно указанного пути к файлу

ModelBusReference содержит ReferenceContext — словарь, в котором можно хранить такую информацию, как путь к файлу, относительно которого его следует сериализовать.

Сериализация относительно пути:

elementReference.ReferenceContext.Add(
   ModelBusReferencePropertySerializer.FilePathSaveContextKey,
   currentProjectFilePath);
string serialized = modelBus.SerializeReference(elementReference);

Получение ссылки из строки:

ReferenceContext context = new ReferenceContext();
context.Add(ModelBusReferencePropertySerializer.FilePathLoadContextKey,
    currentProjectFilePath);
ModelBusReference elementReferenceRestored =
    modelBus.DeserializeReference(serialized, context);

Ссылки modelBus, созданные другими адаптерами

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

ModelBusReference (MBR) состоит из двух частей: заголовка MBR, десериализованого шиной модели, и адаптера, который обрабатывается специальным диспетчером адаптеров. Этот подход позволяет предоставить собственный формат сериализации адаптера. Например, можно ссылаться на базу данных, а не на файл, или хранить дополнительные сведения в ссылке на адаптер. Собственный адаптер может помещать дополнительные сведения в ReferenceContext.

При десериализации MBR необходимо указать контекст ссылки (ReferenceContext), который сохраняется в объекте MBR. При сериализации MBR, сохраненное значение ReferenceContext используется адаптером для создания строки. Десериализированная строка не содержит все сведения в ReferenceContext. Например, в простом адаптере на основе файлов referenceContext содержит корневой путь к файлу. Путь не хранится в сериализованной строке МБ R.

MBR десериализуется в два этапа.

  • ModelBusReferencePropertySerializer— это стандартный сериализатор, который работает с заголовком МБ R. Он использует стандартный для DSL контейнер свойств SerializationContext, который сохраняется в ReferenceContext с помощью ключа ModelBusReferencePropertySerializer.ModelBusLoadContextKey. В частности, SerializationContext должен содержать экземпляр ModelBus.

  • Адаптер ModelBus работает с адаптерной частью MBR. Он может использовать дополнительные сведения, сохраненные в значении ReferenceContext ссылки ModelBus. Простой адаптер на основе файлов сохраняет пути к корневому файлу с помощью ключей FilePathLoadContextKey и FilePathSaveContextKey.

    Ссылка на адаптер в файле модели десериализируется только при его использовании.

Создание модели

Создание, открытие и редактирование модели

Следующий фрагмент взят из примера state Machine на веб-сайте VMSDK. В нем показывается использование ссылок ModelBus для создания и открытия модели, а также для получения связанной с моделью схемы.

В данном примере целевой DSL имеет имя StateMachine. От него наследуются несколько имен, например имя класса модели и имя ModelBusAdapter.

using Fabrikam.StateMachine.ModelBusAdapters;
using Microsoft.VisualStudio.Modeling;
using Microsoft.VisualStudio.Modeling.Diagrams;
using Microsoft.VisualStudio.Modeling.Integration;
using Microsoft.VisualStudio.Modeling.Integration.Shell;
using Microsoft.VisualStudio.Modeling.Shell;
...
// Create a new model.
ModelBusReference modelReference =
   StateMachineAdapterManager    .CreateStateMachineModel(modelName, fileName);
//Keep reference of new model in this model.
using (Transaction t = ...)
{
  myModelElement.ReferenceProperty = modelReference;
  t.Commit();
}
// Get the ModelBus service from Visual Studio.
IModelBus modelBus = Microsoft.VisualStudio.Shell.Package.
    GetGlobalService(typeof(SModelBus)) as IModelBus;
// Get a modelbus adapter on the new model.
ModelBusAdapter modelBusAdapter;
modelBus.TryCreateAdapter(modelReference,
    this.ServiceProvider, out modelBusAdapter);
using (StateMachineAdapter adapter =
      modelBusAdapter as StateMachineAdapter)
{
    if (adapter != null)
    {
        // Obtain a Diagram from the adapter.
        Diagram targetDiagram =
           ((StandardVsModelingDiagramView)
                 adapter.GetDefaultView()
            ).Diagram;

        using (Transaction t =
             targetDiagram.Store.TransactionManager
                .BeginTransaction("Update diagram"))
        {
            DoUpdates(targetDiagram);
            t.Commit();
        }

        // Display the new diagram.
        adapter.GetDefaultView().Show();
    }
}

Проверка ссылок

BrokenReferenceDetector проверяет все свойства домена в хранилище (Store), которое может содержать ссылки ModelBus (ModelBusReference). Он вызывает действие, которое определяет место выполнения любого действия. Этот тест полезен для методов проверки. Следующий метод проверки тестирует хранилище, пытаясь сохранить модель, и сообщает в окне ошибок о "битых" ссылках:

[ValidationMethod(ValidationCategories.Save)]
public void ValidateModelBusReferences(ValidationContext context)
{
  BrokenReferenceDetector.DetectBrokenReferences(this.Store,
    delegate(ModelElement element, // parent of property
             DomainPropertyInfo property, // identifies property
             ModelBusReference reference) // invalid reference
    {
      context.LogError(string.Format(INVALID_REF_FORMAT,
             property.Name,
             referenceState.Name,
             new ModelBusReferenceTypeConverter().
                 ConvertToInvariantString(reference)),
         "Reference",
         element);
    });
}
private const string INVALID_REF_FORMAT =
    "The '{0}' domain property of this ReferenceState instance "
  + "named '{1}' contains reference value '{2}' which is invalid";

Действия, выполняемые расширением ModelBus

Следующие сведения могут оказаться полезными, если вы используете ModelBus.

Расширение ModelBus вносит в решение DSL описанные ниже изменения.

Щелкнув правой кнопкой мыши схему определения DSL, выберите "Включить modelbus" и выберите "Включить этот DSL" для использования ModelBus:

  • В проекте DSL необходимо добавить ссылку на Microsoft.VisualStudio.Modeling.Sdk.Integration.dll.

  • В окне "Определение DSL" добавляется ссылка внешнего типа: Microsoft.VisualStudio.Modeling.Integration.ModelBusReference.

    Ссылку можно просмотреть в Обозреватель DSL в разделе "Типы доменов". Чтобы добавить ссылки внешнего типа вручную, щелкните корневой узел правой кнопкой мыши.

  • Добавлен новый файл шаблона Dsl \GeneratedCode\ModelBusReferencesSerialization.tt.

Если задать тип свойства домена в ModelBusReference, а затем щелкните правой кнопкой мыши свойство и выберите параметр Enable ModelBusReference specific properties:

  • В свойство домена будут добавлены несколько атрибутов CLR. Их можно увидеть в поле "Настраиваемые атрибуты" в окне "Свойства ". В Dsl\GeneratedCode\DomainClasses.cs можно просмотреть атрибуты в объявлении свойств:

    [System.ComponentModel.TypeConverter(typeof(
    Microsoft.VisualStudio.Modeling.Integration.ModelBusReferenceTypeConverter))]
    [System.ComponentModel.Editor(typeof(
      Microsoft.VisualStudio.Modeling.Integration.Picker
      .ModelReferenceEditor // or ModelElementReferenceEditor
      ), typeof(System.Drawing.Design.UITypeEditor))]
    [Microsoft.VisualStudio.Modeling.Integration.Picker
      .SupplyFileBasedBrowserConfiguration
      ("Choose a model file", "Target model|*.target")]
    

Щелкнув правой кнопкой мыши схему определения DSL, выберите "Включить ModelBus" и выберите "Предоставить этот DSL" в ModelBus:

  • Новый проект ModelBusAdapter будет добавлен в решение.

  • Ссылка на ModelBusAdapter будет добавлена в проект DslPackage. ModelBusAdapter имеет ссылку на Dsl проект.

  • В DslPackage\source.extention.tt|ModelBusAdapter| добавляется в качестве компонента MEF.