Aracılığıyla paylaş


Program Kodunda Dosyadan Model Açma

DSL modellerini herhangi bir uygulamada açabilirsiniz.

Visual Studio uzantısından Bu amaçla ModelBus'ı kullanabilirsiniz. ModelBus, modeldeki bir modele veya öğelere başvurmak ve taşınıp taşınmadığını bulmak için standart mekanizma sağlar. Daha fazla bilgi için bkz . Visual Studio Modelbus kullanarak Modelleri Tümleştirme.

Hedef çerçeve

Uygulama projenizin Hedef çerçevesini .NET Framework 4 veya üzeri olarak ayarlayın.

  1. DSL modelini okumak istediğiniz uygulamanın Visual Studio projesini açın.

  2. Çözüm Gezgini'de projeye sağ tıklayın ve ardından Özellikler'e tıklayın.

  3. Proje özellikleri penceresinde, Uygulama sekmesinde Hedef çerçeve alanını .NET Framework 4 (veya üzeri) olarak ayarlayın.

Not

Hedef çerçeve .NET Framework 4 İstemci Profili olmamalıdır.

Başvurular

Visual Studio uygulama projenize şu başvuruları ekleyin:

  • Microsoft.VisualStudio.Modeling.Sdk.11.0

    • Başvuru Ekle iletişim kutusundaki .NET sekmesinin altında bunu görmüyorsanız Gözat sekmesine tıklayın ve öğesine %Program Files%\Microsoft Visual Studio\2022\YourVSversionSKU\VSSDK\VisualStudioIntegration\Common\Assembliesgidin.
  • DSL projenizin bölme klasörünün altında bulabileceğiniz DSL derlemeniz. Adı genellikle şu biçimdedir: Şirketiniz.YourProject.Dsl.dll.

DSL'deki önemli sınıflar

DSL'nizi okuyan kodu yazabilmeniz için önce DSL'niz tarafından oluşturulan bazı sınıfların adlarını bilmeniz gerekir. DSL çözümünüzde Dsl projesini açın ve GeneratedCode klasörüne bakın. Alternatif olarak, proje Başvurularınızdaki DSL derlemesine çift tıklayın ve DSL ad alanını Object Browser'da açın.

Tanımlamanız gereken sınıflar şunlardır:

  • YourDslRootClass - Bu, içindeki kök sınıfın DslDefinition.dsladıdır.

  • YourDslName SerializationHelper - Bu sınıf DSL projenizde tanımlanır SerializationHelper.cs .

  • YourDslName DomainModel - Bu sınıf DSL projenizde tanımlanır DomainModel.cs .

Dosyadan okuma

Aşağıdaki örnek, önemli sınıfların aşağıdaki gibi olduğu bir DSL okumak için tasarlanmıştır:

  • FamilyTreeModel

  • FamilyTreeSerializationHelper

  • FamilyTreeDomainModel

Bu DSL'deki diğer etki alanı sınıfı Kişi'dir.

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);
        }
} } } }

Dosyaya kaydetme

Önceki koda aşağıdaki ekleme modelde bir değişiklik yapar ve bunu bir dosyaya kaydeder.

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