Открытие модели из файла в коде программы
Модели DSL можно открыть в любом приложении.
В расширении Visual Studio можно использовать ModelBus для этой цели. ModelBus предоставляет стандартный механизм для ссылки на модель или элементы в модели, а также для поиска модели, если она перемещена. Дополнительные сведения см. в разделе "Интеграция моделей с помощью Visual Studio Modelbus".
Целевая платформа
Задайте для целевой платформы проекта приложения значение платформа .NET Framework 4 или более поздней версии.
Откройте проект Visual Studio для приложения, в котором требуется прочитать модель DSL.
В Обозреватель решений щелкните проект правой кнопкой мыши и выберите пункт "Свойства".
В окне свойств проекта на вкладке "Приложение" задайте для поля целевой платформы значение платформа .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
.
- Если это не отображается на вкладке .NET в диалоговом окне "Добавление ссылок ", щелкните вкладку "Обзор " и перейдите к ней
Сборка DSL, которая будет находиться в папке bin проекта DSL. Его имя обычно является формой: YourCompany.YourProject
.Dsl.dll
.
Важные классы в DSL
Прежде чем писать код, считывающий DSL, следует знать имена некоторых классов, созданных DSL. В решении DSL откройте проект Dsl и просмотрите папку GeneratedCode . Кроме того, дважды щелкните сборку DSL в справочниках проекта и откройте пространство имен DSL в обозревателе объектов.
Это классы, которые следует определить:
YourDslRootClass — это имя корневого класса в вашем
DslDefinition.dsl
.YourDslName
SerializationHelper
— этот класс определен вSerializationHelper.cs
проекте DSL.YourDslName
DomainModel
— этот класс определен вDomainModel.cs
проекте DSL.
Считывает данные из файла
Следующий пример предназначен для чтения 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)
{ ... }