Pregunta

He estado usando el ROWLEX biblioteca para manejar RDF-s. Se incluye una herramienta de interfaz gráfica de usuario designtime llamada OwlGrinder.exe que puede generar C # clases de ayuda (NET para ser exactos) de mis ontologías OWL. Me pregunto si alguien sabe si podría hacer lo mismo mediante programación en tiempo de ejecución.

¿Fue útil?

Solución

ROWLEX sólo se convirtió en código abierto, por lo que ahora usted tiene la oportunidad de ver en realidad dentro del código de OwlGrinder.exe y copia el código de allí. Sin embargo, aquí hay una breve ejemplo:

    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 desea generar ensamblados en tiempo de ejecución, supongo que es posible que desee repetir una y otra vez como sus demandas de los usuarios. Usted tiene que tener cuidado aquí, porque .NET no le permite descargar una asamblea. Por lo tanto usted no puede deshacerse de las asambleas de las carreras anteriores. La solución es que se ejecuta el código de generación cada vez en un nuevo dominio de aplicación que puede ser descargada. OwlGrinder.exe hace exactamente esto, es posible que desee alcanzar su punto máximo dentro de las MainForm.cs

Otros consejos

Sí, Sr. Lame, se puede generar mediante programación de código .NET.

Hay un par de opciones.

  1. Crea el código como texto.
    Se puede compilar cualquier .cs o .vb archivo de origen desde dentro de una aplicación. Consulte la ayuda para la clase Microsoft.CSharp.CSharpCodeProvider, para un aperitivo. Se invoca el compilador mediante programación, especificando los recursos para incrustar, dónde colocar el ensamblado generado, las dependencias, y así sucesivamente. Un escenario aquí es utilizar un archivo template.cs, la incorporación de un poco más de código en él, y luego compilarlo. El resultado es un conjunto (.dll o .exe o .netmodule si se quiere) que resulta de ese código. A continuación, puede cargar ese montaje y poner en él, utilizando la reflexión.

  2. Crea el código utilizando un modelo de objeto de documento.
    El área de características relevantes que aquí se llama "CodeDom" y funciona como el DOM HTML para páginas web, excepto el modelo de objetos de documento se utiliza para crear el código .NET. Mediante programación a construir el código, usando elementos DOM.

ejemplo de lo 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 Usted puede agregar métodos regulares, todo tipo de declaraciones en el código, y así sucesivamente. Que yo sepa la materia CodeDom apoya todo lo soporta el lenguaje. Usted puede hacer lambda y expresiones LINQ, condicionales y flujo de control, nada.

A continuación, puede compilar esa clase, y otra vez producir un montaje que se puede guardar en el disco o guardar en la memoria y cargar dinámicamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top