Abrir un modelo desde un archivo en el código del programa
Los modelos DSL se pueden abrir en cualquier aplicación.
En las extensiones de Visual Studio, se puede usar ModelBus para este fin. ModelBus proporciona un mecanismo estándar para hacer referencia a un modelo o a los elementos de un modelo, y para buscar el modelo si se ha movido. Para más información, consulte Integración de modelos mediante Visual Studio ModelBus.
Plataforma de destino
Establezca la plataforma de destino del proyecto de aplicación en .NET Framework 4, o en cualquier versión posterior.
Abra el proyecto de Visual Studio para la aplicación en la que desea leer un modelo DSL.
En el Explorador de soluciones, haga clic con el botón secundario en el proyecto y, a continuación, haga clic en Propiedades.
En la ventana de propiedades del proyecto, en la pestaña Aplicación, en el campo Plataforma de destino seleccione .NET Framework 4 (o posterior).
Nota
La plataforma de destino no debe ser el perfil de cliente de .NET Framework 4.
Referencias
Agregue estas referencias al proyecto de aplicación de Visual Studio:
Microsoft.VisualStudio.Modeling.Sdk.11.0
- Si no lo ve en la pestaña .NET del cuadro de diálogo Agregar referencias, haga clic en la pestaña Examinar y vaya a
%Program Files%\Microsoft Visual Studio\2022\YourVSversionSKU\VSSDK\VisualStudioIntegration\Common\Assemblies
.
- Si no lo ve en la pestaña .NET del cuadro de diálogo Agregar referencias, haga clic en la pestaña Examinar y vaya a
El ensamblado DSL, que encontrará en la carpeta bin del proyecto DSL. Su nombre suele tener el formato: SuEmpresa.SuProyecto
.Dsl.dll
.
Clases importantes en el DSL
Para poder escribir el código que lee el DSL, debe conocer los nombres de algunas de las clases generadas por el DSL. En la solución DSL, abra el proyecto Dsl y busque en la carpeta GeneratedCode. Como alternativa, haga doble clic en el ensamblado DSL del proyecto References y abra el espacio de nombres DSL en el Explorador de objetos.
Estas son las clases que debe identificar:
YourDslRootClass: es el nombre de la clase raíz de
DslDefinition.dsl
.YourDslName
SerializationHelper
: esta clase se define enSerializationHelper.cs
en el proyecto DSL.YourDslName
DomainModel
: esta clase se define enDomainModel.cs
en el proyecto DSL.
Leer de un archivo
El ejemplo siguiente está diseñado para leer un DSL en el que las clases importantes son las siguientes:
FamilyTreeModel
FamilyTreeSerializationHelper
FamilyTreeDomainModel
La otra clase del dominio de este DSL es 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);
}
} } } }
Almacenamiento en un archivo
La siguiente adición al código anterior realiza un cambio en el modelo y, luego, lo guarda en un archivo.
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)
{ ... }