Condividi tramite


Aprire un modello da file nel codice del programma

È possibile aprire modelli DSL in qualsiasi applicazione.

Da un'estensione di Visual Studio è possibile usare ModelBus a questo scopo. ModelBus fornisce un meccanismo standard per fare riferimento a un modello o a elementi in un modello e per trovare il modello se è stato spostato. Per altre informazioni, vedere Integrazione di modelli con Visual Studio Modelbus.

Framework di destinazione

Impostare Framework di destinazione del progetto dell'applicazione su .NET Framework 4 o versione successiva.

  1. Aprire il progetto di Visual Studio per l'applicazione in cui si vuole leggere un modello DSL.

  2. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto e quindi scegliere Proprietà.

  3. Nella finestra delle proprietà del progetto, nella scheda Applicazione impostare il campo Framework di destinazione su .NET Framework 4 (o versione successiva).

Nota

Il framework di destinazione non deve essere .NET Framework 4 Client Profile.

Riferimenti

Aggiungere questi riferimenti al progetto di applicazione di Visual Studio:

  • Microsoft.VisualStudio.Modeling.Sdk.11.0

    • Se questa opzione non viene visualizzata nella scheda .NET della finestra di dialogo Aggiungi riferimenti , fare clic sulla scheda Sfoglia e passare a %Program Files%\Microsoft Visual Studio\2022\YourVSversionSKU\VSSDK\VisualStudioIntegration\Common\Assemblies.
  • L'assembly DSL, disponibile nella cartella bin del progetto DSL. Il nome è in genere il formato YourCompany.YourProject.Dsl.dll.

Classi importanti nel linguaggio DSL

Prima di poter scrivere il codice che legge il linguaggio DSL, è necessario conoscere i nomi di alcune classi generate dal linguaggio DSL. Nella soluzione DSL aprire il progetto Dsl e cercare nella cartella GeneratedCode . In alternativa, fare doppio clic sull'assembly DSL nei riferimenti al progetto e aprire lo spazio dei nomi DSL in Visualizzatore oggetti.

Queste sono le classi che è necessario identificare:

  • YourDslRootClass : nome della classe radice nella classe DslDefinition.dsl.

  • YourDslNameSerializationHelper : questa classe è definita nel SerializationHelper.cs progetto DSL.

  • YourDslNameDomainModel : questa classe è definita nel DomainModel.cs progetto DSL.

Legge da un file

L'esempio seguente è progettato per leggere un linguaggio DSL in cui le classi importanti sono le seguenti:

  • FamilyTreeModel

  • FamilyTreeSerializationHelper

  • FamilyTreeDomainModel

L'altra classe di dominio in questo linguaggio 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);
        }
} } } }

Salva in un file

L'aggiunta seguente al codice precedente apporta una modifica al modello e quindi la salva in un file.

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