Frage

Ich habe mit der ROWLEX Bibliothek RDF-s zu behandeln. Es heißt OwlGrinder.exe mit einem Entwurfszeit GUI-Tool ausgeliefert, die C # Hilfsklassen (.NET-Assemblies um genau zu sein) von meinen OWL-Ontologien erzeugen können. Ich frage mich, ob jemand weiß, ob ich die gleichen programmatisch in Runtime tun könnte.

War es hilfreich?

Lösung

ROWLEX wurde nur Open Source, so jetzt haben Sie die Möglichkeit, in dem Code von OwlGrinder.exe tatsächlich aussieht und den Code von dort zu kopieren. Allerdings ist hier ein kurzes Beispiel:

    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();
            }

    }

Wenn Sie Baugruppen im laufenden Betrieb erzeugen wollen, nehme ich an, dass Sie das immer und immer wieder als Benutzeranforderungen wiederholen mögen. Sie müssen hier aufpassen, weil .NET nicht zulässt, dass eine Baugruppe entladen. Sie können also nicht der Baugruppen von Ihrem bisherigen Läufe loszuwerden. Die Lösung besteht darin, dass Sie die Generierung Code jedes Mal in einem neuen AppDomain auszuführen, die entladen werden können. OwlGrinder.exe tut genau dies, könnte man in den MainForm.cs emporzuragen wollen

Andere Tipps

Ja, Herr Lame, können Sie programmatisch .NET-Code generieren.

Es gibt ein paar Optionen.

  1. Erstellen Sie den Code als Text.
    Sie können alle .cs kompilieren oder .vb Quelldatei aus innerhalb einer App. Siehe die Hilfe für die Microsoft.CSharp.CSharpCodeProvider Klasse, für eine Vorspeise. Sie rufen programmatisch den Compiler, um die Ressourcen zu einbetten spezifizieren, wo die generierte Assembly zu setzen, um die Abhängigkeiten, und so weiter. Ein Szenario, hier wird mit einer template.cs Datei, ein wenig mehr Code in das Einbetten und Kompilieren es dann. Das Ergebnis ist eine Anordnung (DLL oder EXE oder .netmodule, wenn Sie möchten), die aus diesem Code. Sie können dann die Assembly laden und in sie nennen, Reflexion verwendet wird.

  2. Erstellen Sie den Code ein Dokument-Objektmodell verwendet.
    Der entsprechende Funktion Bereich hier ist „CodeDom“ genannt, und es funktioniert wie der HTML-DOM für Web-Seiten, mit Ausnahme des Document Object Model verwendete .NET-Code zu erstellen. Programmatische Sie den Code konstruieren, DOM-Elemente verwenden.

Beispiel für die CodeDom Sache:

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. können Sie regelmäßige Methoden hinzufügen, alle Arten von Anweisungen im Code, und so weiter. AFAIK das CodeDom Zeug alles unterstützt unterstützt die Sprache. Sie können lambdas tun und Linq Ausdrücke, Bedingungen und Kontrollfluss, alles.

Sie können dann diese Klasse kompilieren, und wieder eine Baugruppe erzeugen, die Sie dynamisch im Speicher auf der Festplatte oder halten und laden speichern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top