Domanda

Sono stato con la ROWLEX libreria per gestire RDF-s. Esso viene fornito con uno strumento chiamato designtime GUI OwlGrinder.exe in grado di generare C # classi di supporto (assembly .NET per l'esattezza) dai miei ontologie OWL. Mi chiedo se qualcuno sa se ho potuto fare la stessa programmazione in fase di esecuzione.

È stato utile?

Soluzione

ROWLEX appena diventato open source, così ora avete la possibilità di guardare in realtà all'interno del codice di OwlGrinder.exe e copiare il codice da lì. Tuttavia, ecco un breve esempio:

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

    }

Se si desidera generare assembly in fase di esecuzione, suppongo che si potrebbe desiderare di ripetere che più e più volte come le vostre esigenze degli utenti. Bisogna fare attenzione qui, perché .NET non consente di trasferire le un'assemblea. Pertanto non si può sbarazzarsi di assemblee dalle tue corse precedenti. La soluzione è che si esegue il codice di generazione ogni volta in un nuovo dominio di applicazione che può essere scaricato. OwlGrinder.exe fa esattamente questo, si potrebbe desiderare di picco all'interno delle MainForm.cs

Altri suggerimenti

Sì, signor Lame, è possibile generare il codice di programmazione .NET.

Ci sono un paio di opzioni.

  1. Crea il codice come testo.
    È possibile compilare qualsiasi cs o vb file di origine dall'interno di un'applicazione. Vedere l'aiuto per la classe Microsoft.CSharp.CSharpCodeProvider, per un antipasto. Si richiama il compilatore a livello di codice, specificando le risorse per incorporare, dove poter inserire l'assembly generato, le dipendenze, e così via. Uno scenario qui sta usando un file template.cs, incorporando un po 'più di codice in esso, e quindi compilarlo. Il risultato è un assemblaggio (dll o exe o .netmodule se vi piace) risultante da tale codice. È quindi possibile caricare il montaggio e mettere in esso, utilizzando la riflessione.

  2. Crea il codice utilizzando un modello di oggetto documento.
    L'area caratteristica principale qui si chiama "CodeDom" e funziona come il DOM HTML per le pagine web, ad eccezione del modello a oggetti del documento viene utilizzato per creare il codice .NET. Programmazione si costruisce il codice, utilizzando elementi DOM.

esempio di cosa 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);

ecc ecc È possibile aggiungere i metodi regolari, tutti i tipi di dichiarazioni nel codice, e così via. Per quanto ne so la roba CodeDom sostiene tutto ciò che supporta il linguaggio. Si può fare lambda ed espressioni LINQ, condizionali e flusso di controllo, qualsiasi cosa.

È possibile quindi compilare quella classe, e di nuovo produrre un assembly che è possibile salvare su disco o mantenere in memoria e caricare dinamicamente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top