Otwieranie modelu z pliku w kodzie programu
Modele DSL można otwierać w dowolnej aplikacji.
W tym celu można użyć narzędzia ModelBus z poziomu rozszerzenia programu Visual Studio. ModelBus zapewnia standardowy mechanizm odwoływania się do modelu lub elementów oraz do znajdowania modelu, jeśli został przeniesiony. Aby uzyskać więcej informacji, zobacz Integrowanie modeli przy użyciu programu Visual Studio Modelbus.
Platforma docelowa
Ustaw platformę Docelową projektu aplikacji na .NET Framework 4 lub nowszą.
Otwórz projekt programu Visual Studio dla aplikacji, w której chcesz odczytać model DSL.
W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt, a następnie kliknij polecenie Właściwości.
W oknie właściwości projektu na karcie Aplikacja ustaw pole Platformy docelowej na .NET Framework 4 (lub nowsze).
Uwaga
Platforma docelowa nie powinna być profilem klienta programu .NET Framework 4.
Informacje
Dodaj te odwołania do projektu aplikacji programu Visual Studio:
Microsoft.VisualStudio.Modeling.Sdk.11.0
- Jeśli nie widzisz tego na karcie .NET w oknie dialogowym Dodawanie odwołań , kliknij kartę Przeglądaj i przejdź do
%Program Files%\Microsoft Visual Studio\2022\YourVSversionSKU\VSSDK\VisualStudioIntegration\Common\Assemblies
strony .
- Jeśli nie widzisz tego na karcie .NET w oknie dialogowym Dodawanie odwołań , kliknij kartę Przeglądaj i przejdź do
Zestaw DSL, który znajduje się w folderze bin projektu DSL. Jego nazwa jest zazwyczaj postacią: YourCompany.YourProject
.Dsl.dll
.
Ważne klasy w języku DSL
Zanim będzie można napisać kod odczytujący język DSL, należy znać nazwy niektórych klas wygenerowanych przez rozszerzenie DSL. W rozwiązaniu DSL otwórz projekt Dsl i wyszukaj go w folderze GeneratedCode . Alternatywnie kliknij dwukrotnie zestaw DSL w dokumentacji projektu i otwórz przestrzeń nazw DSL w przeglądarce obiektów.
Są to klasy, które należy zidentyfikować:
YourDslRootClass — jest to nazwa klasy głównej w pliku
DslDefinition.dsl
.YourDslName
SerializationHelper
— ta klasa jest zdefiniowana wSerializationHelper.cs
projekcie DSL.YourDslName
DomainModel
— ta klasa jest zdefiniowana wDomainModel.cs
projekcie DSL.
Odczyt z pliku
Poniższy przykład został zaprojektowany tak, aby odczytywał język DSL, w którym ważne klasy są następujące:
FamilyTreeModel
FamilyTreeSerializationHelper
FamilyTreeDomainModel
Inną klasą domeny w tym języku DSL jest Osoba.
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);
}
} } } }
Zapisywanie w pliku
Poniższy dodatek do poprzedniego kodu wprowadza zmianę w modelu, a następnie zapisuje go w pliku.
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)
{ ... }