Otwieranie modelu z pliku w kodzie programu

Modele DSL można otwierać w dowolnej aplikacji.

W tym celu można użyć narzędzia ModelBus z poziomu rozszerzenia programu Visual Studio. ModelBus zapewnia standardowy mechanizm odwoływania się do modelu lub elementów oraz do znajdowania modelu, jeśli został przeniesiony. Aby uzyskać więcej informacji, zobacz Integrowanie modeli przy użyciu programu Visual Studio Modelbus.

Platforma docelowa

Ustaw platformę Docelową projektu aplikacji na .NET Framework 4 lub nowszą.

  1. Otwórz projekt programu Visual Studio dla aplikacji, w której chcesz odczytać model DSL.

  2. W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt, a następnie kliknij polecenie Właściwości.

  3. W oknie właściwości projektu na karcie Aplikacja ustaw pole Platformy docelowej na .NET Framework 4 (lub nowsze).

Uwaga

Platforma docelowa nie powinna być profilem klienta programu .NET Framework 4.

Informacje

Dodaj te odwołania do projektu aplikacji programu Visual Studio:

  • Microsoft.VisualStudio.Modeling.Sdk.11.0

    • Jeśli nie widzisz tego na karcie .NET w oknie dialogowym Dodawanie odwołań , kliknij kartę Przeglądaj i przejdź do %Program Files%\Microsoft Visual Studio\2022\YourVSversionSKU\VSSDK\VisualStudioIntegration\Common\Assembliesstrony .
  • Zestaw DSL, który znajduje się w folderze bin projektu DSL. Jego nazwa jest zazwyczaj postacią: YourCompany.YourProject.Dsl.dll.

Ważne klasy w języku DSL

Zanim będzie można napisać kod odczytujący język DSL, należy znać nazwy niektórych klas wygenerowanych przez rozszerzenie DSL. W rozwiązaniu DSL otwórz projekt Dsl i wyszukaj go w folderze GeneratedCode . Alternatywnie kliknij dwukrotnie zestaw DSL w dokumentacji projektu i otwórz przestrzeń nazw DSL w przeglądarce obiektów.

Są to klasy, które należy zidentyfikować:

  • YourDslRootClass — jest to nazwa klasy głównej w pliku DslDefinition.dsl.

  • YourDslNameSerializationHelper — ta klasa jest zdefiniowana w SerializationHelper.cs projekcie DSL.

  • YourDslNameDomainModel — ta klasa jest zdefiniowana w DomainModel.cs projekcie DSL.

Odczyt z pliku

Poniższy przykład został zaprojektowany tak, aby odczytywał język DSL, w którym ważne klasy są następujące:

  • FamilyTreeModel

  • FamilyTreeSerializationHelper

  • FamilyTreeDomainModel

Inną klasą domeny w tym języku DSL jest Osoba.

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);
        }
} } } }

Zapisywanie w pliku

Poniższy dodatek do poprzedniego kodu wprowadza zmianę w modelu, a następnie zapisuje go w pliku.

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)
{ ... }