다음을 통해 공유


프로그램 코드로 파일에서 모델 열기

모든 애플리케이션에서 DSL 모델을 열 수 있습니다.

Visual Studio 확장에서 이 용도로 ModelBus를 사용할 수 있습니다. ModelBus에서는 모델 또는 모델의 요소를 참조하고, 이동한 경우 모델을 찾는 데 사용하는 표준 메커니즘을 제공합니다. 자세한 내용은 Visual Studio Modelbus를 사용하여 모델 통합을 참조하세요.

대상 프레임워크

애플리케이션 프로젝트의 대상 프레임워크를 .NET Framework 4 이상으로 설정합니다.

  1. DSL 모델을 읽으려는 애플리케이션에 대한 Visual Studio 프로젝트를 엽니다.

  2. 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭하고 속성을 클릭합니다.

  3. 프로젝트 속성 창의 애플리케이션 탭에서 대상 프레임워크 필드를 .NET Framework 4(이상)로 설정합니다.

참고 항목

대상 프레임워크는 .NET Framework 4 클라이언트 프로필이어야 합니다.

참조

Visual Studio 애플리케이션 프로젝트에 다음 참조를 추가합니다.

  • Microsoft.VisualStudio.Modeling.Sdk.11.0

    • 참조 추가 대화 상자의 .NET 탭에 이 항목이 표시되지 않으면 찾아보기 탭을 클릭하고 %Program Files%\Microsoft Visual Studio\2022\YourVSversionSKU\VSSDK\VisualStudioIntegration\Common\Assemblies로 이동합니다.
  • DSL 어셈블리는 DSL 프로젝트의 bin 폴더 아래에 있습니다. 해당 이름은 일반적으로 YourCompany.YourProject.Dsl.dll 양식입니다.

DSL의 중요한 클래스

DSL을 읽는 코드를 쓸 수 있으려면 DSL에서 생성된 일부 클래스의 이름을 알아야 합니다. DSL 솔루션에서 Dsl 프로젝트를 열고 GeneratedCode 폴더를 찾습니다. 또는 References 프로젝트에서 DSL 어셈블리를 두 번 클릭하고 개체 브라우저에서 DSL 네임스페이스를 엽니다.

다음은 식별해야 하는 클래스입니다.

  • YourDslRootClass - DslDefinition.dsl의 루트 클래스 이름입니다.

  • YourDslName SerializationHelper - 이 클래스는 DSL 프로젝트의 SerializationHelper.cs에 정의됩니다.

  • YourDslName DomainModel - 이 클래스는 DSL 프로젝트의 DomainModel.cs에 정의됩니다.

파일에서 읽습니다.

다음 예제는 중요한 클래스가 다음과 같은 DSL을 읽도록 설계되었습니다.

  • FamilyTreeModel

  • FamilyTreeSerializationHelper

  • FamilyTreeDomainModel

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

파일에 저장

이전 코드에 다음을 추가하면 모델을 변경한 다음 파일에 저장합니다.

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