Abrir um modelo de um arquivo no código do programa

Você pode abrir modelos DSL em qualquer aplicativo.

Em uma extensão do Visual Studio, você pode usar o ModelBus para essa finalidade. O ModelBus fornece um mecanismo padrão para referenciar um modelo ou elementos em um modelo e para localizar o modelo se ele tiver sido movido. Para obter mais informações, confira Integrar modelos usando o Visual Studio Modelbus.

Estrutura de destino

Defina a estrutura de destino do projeto de aplicativo como .NET Framework 4 ou posterior.

  1. Abra o projeto do Visual Studio do aplicativo no qual você deseja ler um modelo DSL.

  2. No Gerenciador de Soluções, clique com o botão direito do mouse no projeto e, em seguida, clique em Propriedades.

  3. Na janela propriedades do projeto, na guia Aplicativo, defina o campo Estrutura de destino como .NET Framework 4 (ou posterior).

Observação

A estrutura de destino não deve ser .NET Framework perfil de cliente 4.

Referências

Adicione estas referências ao seu projeto de aplicativo do Visual Studio:

  • Microsoft.VisualStudio.Modeling.Sdk.11.0

    • Se você não vir essas informações na guia .NET na caixa de diálogo Adicionar Referências, clique na guia Procurar e navegue até %Program Files%\Microsoft Visual Studio\2022\YourVSversionSKU\VSSDK\VisualStudioIntegration\Common\Assemblies.
  • Seu assembly DSL, que você encontrará na pasta bin, seu projeto DSL. Seu nome normalmente é do formato: SuaEmpresa.SeuProjeto.Dsl.dll.

Classes importantes na DSL

Antes de escrever o código que lê sua DSL, você deve saber os nomes de algumas das classes geradas pela DSL. Em sua solução DSL, abra o projeto Dsl e examine a pasta GeneratedCode. Outra opção é clicar duas vezes no assembly DSL em Referências do projeto e abra o namespace DSL no Pesquisador de Objetos.

Essas são as classes que você deve identificar:

  • YourDslRootClass: é o nome da classe raiz em seu DslDefinition.dsl.

  • YourDslNameSerializationHelper: essa classe é definida no SerializationHelper.cs em seu projeto DSL.

  • YourDslNameDomainModel: essa classe é definida no DomainModel.cs em seu projeto DSL.

Ler de um arquivo

O exemplo a seguir foi projetado para ler uma DSL na qual as classes importantes são as seguintes:

  • FamilyTreeModel

  • FamilyTreeSerializationHelper

  • FamilyTreeDomainModel

A outra classe de domínio nessa 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);
        }
} } } }

Salvar em um arquivo

A adição a seguir ao código anterior faz uma alteração no modelo e, em seguida, salva-o em um arquivo.

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