Ouvrir un modèle depuis un fichier dans le code du programme

Vous pouvez ouvrir des modèles DSL dans n’importe quelle application.

À partir d’une extension Visual Studio, vous pouvez utiliser ModelBus à cet effet. ModelBus fournit un mécanisme standard permettant de référencer un modèle ou des éléments dans un modèle et de trouver le modèle s’il a été déplacé. Pour plus d’informations, consultez Intégration de modèles à l’aide de Visual Studio Modelbus.

Version cible de .NET Framework

Définissez le framework cible de votre projet d’application sur .NET Framework 4 ou version ultérieure.

  1. Ouvrez le projet Visual Studio de l’application dans laquelle vous souhaitez lire un modèle DSL.

  2. Dans l'Explorateur de solutions, faites un clic droit sur le projet, puis cliquez sur Propriétés.

  3. Dans la fenêtre des propriétés du projet, sous l’onglet Application, définissez le champ Framework cible sur .NET Framework 4 (ou version ultérieure).

Notes

Le framework cible ne doit pas être le profil client .NET Framework 4.

Références

Ajoutez ces références à votre projet d’application Visual Studio :

  • Microsoft.VisualStudio.Modeling.Sdk.11.0

    • Si vous ne voyez pas cela sous l’onglet .NET dans la boîte de dialogue Ajouter des références, cliquez sur l’onglet Parcourir et accédez à %Program Files%\Microsoft Visual Studio\2022\YourVSversionSKU\VSSDK\VisualStudioIntegration\Common\Assemblies.
  • Votre assembly DSL, que vous trouverez sous le dossier bin de votre projet DSL. Son nom est généralement formé comme ceci : YourCompany.YourProject.Dsl.dll.

Classes importantes dans le DSL

Avant de pouvoir écrire le code qui lit votre DSL, vous devez connaître les noms de certaines des classes générées par votre DSL. Dans votre solution DSL, ouvrez le projet Dsl et recherchez le dossier GeneratedCode. Vous pouvez également double-cliquer sur l’assembly DSL dans les Références de votre projet et ouvrir l’espace de noms DSL dans l’Explorateur d’objets.

Voici les classes que vous devez identifier :

  • YourDslRootClass : il s’agit du nom de la classe racine dans votre DslDefinition.dsl.

  • YourDslNameSerializationHelper : cette classe est définie dans SerializationHelper.cs dans votre projet DSL.

  • YourDslNameDomainModel : cette classe est définie dans DomainModel.cs dans votre projet DSL.

Lire depuis un fichier

L’exemple suivant est conçu pour lire un DSL dans lequel les classes importantes sont les suivantes :

  • FamilyTreeModel

  • FamilyTreeSerializationHelper

  • FamilyTreeDomainModel

L’autre classe de domaine de ce DSL est 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);
        }
} } } }

Enregistrer dans un fichier

L’ajout suivant au code précédent apporte une modification au modèle, puis l’enregistre dans un fichier.

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