Como: abrir um modelo de arquivo no código de programa
Você pode abrir os modelos DSL em qualquer aplicativo.
De um Visual Studio extensão, você pode usar ModelBus para essa finalidade.ModelBus fornece um mecanismo padrão para fazer referência a um modelo ou elementos em um modelo e para localizar o modelo se ele foi movido.Para obter mais informações, consulte A integração de modelos usando o Modelbus de Visual Studio.
Estrutura de destino
Definir o estrutura de destino do seu projeto de aplicativo para .NET Framework 4.
Para definir a estrutura de destino
Abrir o Visual Studio projeto para o aplicativo no qual você deseja ler um modelo DSL.
Em Solution Explorer, o botão direito do mouse no projeto e, em seguida, clique em Propriedades.
Na janela de propriedades do projeto, no aplicativo guia, defina a estrutura de destino campo para .NET Framework 4.
Observação |
---|
Talvez você precise fazer isso, mesmo se você tiver selecionado .NET Framework 4 na caixa de diálogo de criação do projeto.A estrutura de destino não deve ser .4 Do NET Framework Client Profile. |
Referências
Você precisa adicionar essas referências para seu Visual Studio o projeto de aplicativo:
Microsoft.VisualStudio.Modeling.SDK.11.0
- Se você não vir isso estiver sob o .NET guia o Add References caixa de diálogo, clique no Procurar guia e navegue até % SDK\VisualStudioIntegration\Common\Assemblies\ de 2010 do programa Files%\Microsoft Visual Studio.
Seu conjunto DSL, que pode ser encontrada na pasta bin do projeto DSL.Seu nome é normalmente do formulário: YourCompany. YourProject.DSL.dll.
Classes importantes em DSL
Antes de escrever o código que lê seu DSL, você deve saber os nomes de algumas das classes geradas pelo seu DSL.Em sua solução DSL, abra o Dsl de projeto e examinar a GeneratedCode pasta.Como alternativa, clique duas vezes o assembly DSL em seu projeto referênciase abra o namespace DSL na Pesquisador de objetos.
Estas são as classes que você deve identificar:
YourDslRootClass -esse é o nome da classe raiz no seu DslDefinition.dsl.
YourDslNameSerializationHelper -essa classe é definida em SerializationHelper.cs em seu projeto DSL.
YourDslNameDomainModel -essa classe é definida em DomainModel.cs em seu projeto DSL.
Leitura de um arquivo
O exemplo a seguir foi projetado para ler uma DSL na qual as classes importantes são os seguintes:
FamilyTreeModel
FamilyTreeSerializationHelper
FamilyTreeDomainModel
A outra classe de domínio em que essa DSL é uma pessoa.
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);
}
} } } }
Salvá-lo em um arquivo.
A adição de seguir o código anterior faz uma alteração no modelo e, em seguida, salva em um arquivo.
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)
{ ... }