Bagikan melalui


Membuka Model dari File dalam Kode Program

Anda dapat membuka model DSL di aplikasi apa pun.

Dari ekstensi Visual Studio, Anda dapat menggunakan ModelBus untuk tujuan ini. ModelBus menyediakan mekanisme standar untuk mereferensikan model atau elemen dalam model, dan untuk menemukan model jika telah dipindahkan. Untuk informasi selengkapnya, lihat Mengintegrasikan Model dengan menggunakan ModelBus Visual Studio.

Kerangka kerja target

Atur Kerangka kerja target proyek aplikasi Anda ke .NET Framework 4 atau yang lebih baru.

  1. Buka proyek Visual Studio untuk aplikasi tempat Anda ingin membaca model DSL.

  2. Di Penjelajah Solusi, klik kanan proyek kemudian klik Properti.

  3. Di jendela properti proyek, pada tab Aplikasi, atur bidang Kerangka kerja target ke .NET Framework 4 (atau yang lebih baru).

Catatan

Kerangka kerja target tidak boleh .NET Framework 4 Profil Klien.

Referensi

Tambahkan referensi ini ke proyek aplikasi Visual Studio Anda:

  • Microsoft.VisualStudio.Modeling.Sdk.11.0

    • Jika Anda tidak melihat ini di bawah tab .NET dalam kotak dialog Tambahkan Referensi, klik tab Telusuri dan navigasi ke %Program Files%\Microsoft Visual Studio\2022\YourVSversionSKU\VSSDK\VisualStudioIntegration\Common\Assemblies.
  • Rakitan DSL Anda, yang akan Anda temukan di bawah folder bin proyek DSL Anda. Namanya biasanya dari bentuk: YourCompany. YourProject.Dsl.dll.

Kelas penting di DSL

Sebelum Anda dapat menulis kode yang membaca DSL Anda, Anda harus mengetahui nama beberapa kelas yang dihasilkan oleh DSL Anda. Dalam solusi DSL Anda, buka proyek Dsl dan lihat di folder GeneratedCode. Atau, klik dua kali rakitan DSL di Referensi proyek Anda, dan buka namespace DSL di Browser Objek.

Ini adalah kelas yang harus Anda identifikasi:

  • YourDslRootClass - Ini adalah nama kelas root di DslDefinition.dsl Anda.

  • YourDslName SerializationHelper - Kelas ini ditentukan dalam SerializationHelper.cs proyek DSL Anda.

  • YourDslName DomainModel - Kelas ini ditentukan dalam DomainModel.cs proyek DSL Anda.

Membaca dari file

Contoh berikut dirancang untuk membaca DSL di mana kelas penting adalah sebagai berikut:

  • FamilyTreeModel

  • FamilyTreeSerializationHelper

  • FamilyTreeDomainModel

Kelas domain lain dalam DSL ini adalah Orang.

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

Simpan ke file

Tambahan berikut untuk kode sebelumnya membuat perubahan pada model lalu menyimpannya ke 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)
{ ... }