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


Открытие модели из файла в коде программы

Модели DSL можно открыть в любом приложении.

В расширении Visual Studio можно использовать ModelBus для этой цели. ModelBus предоставляет стандартный механизм для ссылки на модель или элементы в модели, а также для поиска модели, если она перемещена. Дополнительные сведения см. в разделе "Интеграция моделей с помощью Visual Studio Modelbus".

Целевая платформа

Задайте для целевой платформы проекта приложения значение платформа .NET Framework 4 или более поздней версии.

  1. Откройте проект Visual Studio для приложения, в котором требуется прочитать модель DSL.

  2. В Обозреватель решений щелкните проект правой кнопкой мыши и выберите пункт "Свойства".

  3. В окне свойств проекта на вкладке "Приложение" задайте для поля целевой платформы значение платформа .NET Framework 4 (или более поздней версии).

Примечание.

Целевая платформа не должна быть платформа .NET Framework 4 профиля клиента.

Ссылки

Добавьте следующие ссылки в проект приложения Visual Studio:

  • Microsoft.VisualStudio.Modeling.Sdk.11.0

    • Если это не отображается на вкладке .NET в диалоговом окне "Добавление ссылок ", щелкните вкладку "Обзор " и перейдите к ней %Program Files%\Microsoft Visual Studio\2022\YourVSversionSKU\VSSDK\VisualStudioIntegration\Common\Assemblies.
  • Сборка DSL, которая будет находиться в папке bin проекта DSL. Его имя обычно является формой: YourCompany.YourProject.Dsl.dll.

Важные классы в DSL

Прежде чем писать код, считывающий DSL, следует знать имена некоторых классов, созданных DSL. В решении DSL откройте проект Dsl и просмотрите папку GeneratedCode . Кроме того, дважды щелкните сборку DSL в справочниках проекта и откройте пространство имен DSL в обозревателе объектов.

Это классы, которые следует определить:

  • YourDslRootClass — это имя корневого класса в вашем DslDefinition.dsl.

  • YourDslName SerializationHelper — этот класс определен в SerializationHelper.cs проекте DSL.

  • YourDslName DomainModel — этот класс определен в DomainModel.cs проекте DSL.

Считывает данные из файла

Следующий пример предназначен для чтения DSL, в котором важные классы приведены следующим образом:

  • FamilyTreeModel

  • FamilyTreeSerializationHelper

  • FamilyTreeDomainModel

Другой класс домена в этом DSL — Person.

using System;
using Microsoft.VisualStudio.Modeling;
using Company.FamilyTree; // Your DSL namespace

namespace StandaloneReadDslConsole
{ class Program
  { static void Main(string[] args)
    {
      // The path of a DSL model file:
      string dslModel = @"C:\FamilyTrees\Tudor.ftree";
      // Set up the Store to read your type of model:
      Store store = new Store(
        typeof(Company.FamilyTree.FamilyTreeDomainModel));
      // The Model type generated by the DSL:
      FamilyTreeModel familyTree;
      // All Store changes must be in a Transaction:
      using (Transaction t =
        store.TransactionManager.BeginTransaction("Load model"))
      {
        familyTree =
           FamilyTreeSerializationHelper.Instance.
              LoadModel(store, dslModel, null, null, null);
        t.Commit(); // Don't forget this!
      }
      // Now we can read the model:
      foreach (Person p in familyTree.People)
      {
        Console.WriteLine(p.Name);
        foreach (Person child in p.Children)
        {
          Console.WriteLine("    " + child.Name);
        }
} } } }

Сохранение в файл

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

using (Transaction t =
  store.TransactionManager.BeginTransaction("update model"))
{
  // Create a new model element:
  Person p = new Person(store);
  // Set its embedding relationship:
  p.FamilyTreeModel = familyTree;
  // - same as: familyTree.People.Add(p);
  // Set its properties:
  p.Name = "Edward VI";
  t.Commit(); // Don't forget this!
}
// Save the model:
try
{
  SerializationResult result = new SerializationResult();
  FamilyTreeSerializationHelper.Instance
    .SaveModel(result, familyTree, @"C:\FamilyTrees\Tudor-upd.ftree");
  // Report any error:
  if (result.Failed)
  {
    foreach (SerializationMessage message in result)
    {
      Console.WriteLine(message);
    }
  }
}
catch (System.IO.IOException ex)
{ ... }