Question

J'utilise la bibliothèque ROWLEX pour gérer s-RDF. Il est livré avec un outil GUI designtime appelé OwlGrinder.exe qui peut générer des classes d'aide C # (assemblages .NET pour être exact) de mes ontologies OWL. Je me demande si quelqu'un sait si je pouvais faire la même chose dans l'exécution par programme.

Était-ce utile?

La solution

ROWLEX juste devenu open source, maintenant que vous avez la chance de regarder réellement à l'intérieur du code de OwlGrinder.exe et copiez le code à partir de là. Cependant, voici un court exemple:

    private NC3A.SI.Rowlex.AssemblyGenerator generator;

    private void RunAssemblyGeneration(XmlDocument ontologyFileInRdfXml)
    {
        this.generator = new NC3A.SI.Rowlex.AssemblyGenerator();
        this.generator.GenerateAsync(ontologyFileInRdfXml, "myAssemblyName", 
                                        null, this.OnGenerationFinished);
    }

    private void OnGenerationFinished(string errorMessage)
    {
        if (errorMessage == null)
        {
            // Success
            // Displaying warnings and saving result
            string[] warnings = this.generator.Warnings;
            this.generator.SaveResult(@"C:\myAssemblyName.dll");
                // Important! One generator instance can be executed only once. 
                this.generator = null; 
                this.RejoiceOverSuccess();
            }
        else
        {
                // Failure
                this.MournOverFailure();
            }

    }

Si vous voulez générer des ensembles dans l'exécution, je suppose que vous pourriez vouloir répéter maintes et maintes fois que vos demandes des utilisateurs. Vous devez faire attention ici, parce que .NET ne vous permet pas de décharger un ensemble. Par conséquent, vous ne pouvez pas vous débarrasser des assemblages de vos courses précédentes. La solution est que vous exécutez le code de génération à chaque fois dans une nouvelle AppDomain qui peut être déchargé. OwlGrinder.exe-ce que cela, vous voudrez peut-être à pic à l'intérieur des MainForm.cs

Autres conseils

Oui, M. Boiteux, vous pouvez générer du code .NET programme.

Il y a deux options.

  1. Créer le code sous forme de texte.
    Vous pouvez compiler des .cs ou .vb fichier source à partir d'une application. Consultez l'aide pour la classe Microsoft.CSharp.CSharpCodeProvider, pour une entrée. Vous invoquez le compilateur par programme, en spécifiant les ressources pour intégrer, où mettre l'ensemble généré, les dépendances, et ainsi de suite. Un scénario est ici en utilisant un fichier template.cs, l'incorporation d'un peu plus dans le code, puis le compiler. Le résultat est un ensemble (.dll ou .exe ou .netmodule si vous le souhaitez) résultant de ce code. Vous pouvez ensuite charger cette assemblée et appeler en elle, en utilisant la réflexion.

  2. Créez le code à l'aide d'un modèle objet de document.
    La zone caractéristique pertinente ici est appelée « CodeDom » et il fonctionne comme le DOM HTML pour les pages web, à l'exception du modèle objet de document est utilisé pour créer un code .NET. Vous construisez le programme code, en utilisant des éléments DOM.

exemple de la chose CodeDom:

var class1 = new System.CodeDom.CodeTypeDeclaration(className);
class1.IsClass=true;
class1.TypeAttributes = System.Reflection.TypeAttributes.Public;
class1.Comments.Add(new System.CodeDom.CodeCommentStatement("This class has been programmatically generated"));
// add a constructor to the class
var ctor= new System.CodeDom.CodeConstructor();
ctor.Attributes = System.CodeDom.MemberAttributes.Public;
ctor.Comments.Add(new System.CodeDom.CodeCommentStatement("the null constructor"));
class1.Members.Add(ctor);

// add one statement to the ctor:  an assignment
// in code it will look like;  _privateField = new Foo(); 
ctor.Statements.Add(new System.CodeDom.CodeAssignStatement(new System.CodeDom.CodeVariableReferenceExpression("_privateField"), new System.CodeDom.CodeObjectCreateExpression(fooType)));


// include a private field into the class
System.CodeDom.CodeMemberField field1;
field1= new System.CodeDom.CodeMemberField();
field1.Attributes = System.CodeDom.MemberAttributes.Private;
field1.Name= "_privateField";
field1.Type=new System.CodeDom.CodeTypeReference(fooType);
class1.Members.Add(field1);

etc etc Vous pouvez ajouter des méthodes régulières, toutes sortes de déclarations contenues dans le code, et ainsi de suite. Autant que je sache les choses CodeDom prend en charge tout ce que la langue prend en charge. Vous pouvez faire lambdas et expressions LINQ, et conditionals flux de contrôle, quoi que ce soit.

Vous pouvez ensuite compiler cette classe, et encore produire un ensemble que vous pouvez enregistrer sur le disque ou de conserver en mémoire et charger dynamiquement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top