Sdílet prostřednictvím


Otevření modelu ze souboru v kódu programu

Modely DSL můžete otevřít v libovolné aplikaci.

Z rozšíření sady Visual Studio můžete k tomuto účelu použít ModelBus. ModelBus poskytuje standardní mechanismus pro odkazování na model nebo prvky v modelu a pro vyhledání modelu, pokud se model přesunul. Další informace naleznete v tématu Integrace modelů pomocí sady Visual Studio Modelbus.

Cílová architektura

Nastavte cílovou architekturu projektu aplikace na .NET Framework 4 nebo novější.

  1. Otevřete projekt sady Visual Studio pro aplikaci, ve které chcete přečíst model DSL.

  2. V Průzkumník řešení klepněte pravým tlačítkem myši na projekt a potom klepněte na příkaz Vlastnosti.

  3. V okně vlastností projektu na kartě Aplikace nastavte pole Cílové rozhraní na .NET Framework 4 (nebo novější).

Poznámka:

Cílová architektura by neměla být profil klienta rozhraní .NET Framework 4.

Reference

Do projektu aplikace sady Visual Studio přidejte tyto odkazy:

  • Microsoft.VisualStudio.Modeling.Sdk.11.0

    • Pokud tuto možnost nevidíte na kartě .NET v dialogovém okně Přidat odkazy , klikněte na kartu Procházet a přejděte na %Program Files%\Microsoft Visual Studio\2022\YourVSversionSKU\VSSDK\VisualStudioIntegration\Common\Assemblies.
  • Vaše sestavení DSL, které najdete ve složce bin projektu DSL. Jeho název je obvykle tvar: YourCompany.Váš projekt.Dsl.dll.

Důležité třídy v DSL

Než budete moci napsat kód, který čte vaše DSL, měli byste znát názvy některých tříd vygenerovaných vaší DSL. V řešení DSL otevřete projekt Dsl a vyhledejte složku GeneratedCode . Případně poklikejte na sestavení DSL v projektu Reference a otevřete obor názvů DSL v prohlížeči objektů.

Toto jsou třídy, které byste měli identifikovat:

  • YourDslRootClass - Toto je název kořenové třídy ve vaší DslDefinition.dsl.

  • YourDslName SerializationHelper – Tato třída je definována v SerializationHelper.cs projektu DSL.

  • YourDslName DomainModel – Tato třída je definována v DomainModel.cs projektu DSL.

Čtení ze souboru

Následující příklad je navržen tak, aby četl DSL, ve kterém jsou důležité třídy následující:

  • FamilyTreeModel

  • FamilyTreeSerializationHelper

  • FamilyTreeDomainModel

Druhá třída domény v této DSL je 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);
        }
} } } }

Uložení do souboru

Následující doplněk k předchozímu kódu provede změnu modelu a uloží ho do souboru.

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