Öffnen eines Modells aus einer Datei im Programmcode

Sie können DSL-Modelle in jeder beliebigen Anwendung öffnen.

In einer Visual Studio-Erweiterung können Sie zu diesem Zweck ModelBus verwenden. ModelBus bietet einen Standardmechanismus zum Verweisen auf ein Modell oder Elemente in einem Modell sowie zum Suchen des Modells, wenn es verschoben wurde. Weitere Informationen finden Sie unter Integrieren von Modellen mithilfe von Visual Studio ModelBus.

Zielframework

Legen Sie das Zielframework Ihres Anwendungsprojekts auf .NET Framework 4 oder höher fest.

  1. Öffnen Sie das Visual Studio-Projekt für die Anwendung, in der Sie ein DSL-Modell lesen möchten.

  2. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und klicken Sie dann auf Eigenschaften.

  3. Legen Sie im Projekteigenschaftenfenster auf der Registerkarte Anwendung das Feld Zielframework auf .NET Framework 4 (oder höher) fest.

Hinweis

Das Zielframework sollte nicht .NET Framework 4 Client Profile sein.

References

Fügen Sie ihrem Visual Studio-Anwendungsprojekt die folgenden Verweise hinzu:

  • Microsoft.VisualStudio.Modeling.Sdk.11.0

    • Wenn dies auf der Registerkarte .NET im Dialogfeld Verweise hinzufügen nicht angezeigt wird, klicken Sie auf die Registerkarte Durchsuchen, und navigieren Sie zu %Program Files%\Microsoft Visual Studio\2022\YourVSversionSKU\VSSDK\VisualStudioIntegration\Common\Assemblies.
  • Ihre DSL-Assembly, die Sie unter dem Ordner „bin“ Ihres DSL-Projekts finden. Der Name weist in der Regel das folgende Format auf: IhrUnternehmen.IhrProjekt.Dsl.dll.

Wichtige Klassen in der DSL

Bevor Sie den Code schreiben können, der Ihre DSL liest, sollten Sie die Namen einiger der von Ihrer DSL generierten Klassen kennen. Öffnen Sie in Ihrer DSL-Projektmappe das Dsl-Projekt, und suchen Sie im Ordner GeneratedCode. Doppelklicken Sie alternativ auf die DSL-Assembly in Ihrem Projekt Verweise, und öffnen Sie den DSL-Namespace im Objektbrowser.

Dies sind die Klassen, die Sie identifizieren sollten:

  • YourDslRootClass: Dies ist der Name der Stammklasse in Ihrer Datei DslDefinition.dsl.

  • YourDslNameSerializationHelper: Diese Klasse ist in SerializationHelper.cs in Ihrem DSL-Projekt definiert.

  • YourDslNameDomainModel: Diese Klasse ist in DomainModel.cs in Ihrem DSL-Projekt definiert.

Lesen aus einer Datei

Das folgende Beispiel dient zum Lesen einer DSL, in der die folgenden Klassen wichtig sind:

  • FamilyTreeModel

  • FamilyTreeSerializationHelper

  • FamilyTreeDomainModel

Die andere Domänenklasse in dieser DSL ist „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);
        }
} } } }

Speichern in einer Datei

Die folgende Ergänzung zum vorherigen Code führt eine Änderung am Modell durch und speichert es dann in einer Datei.

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