Compilar en tiempo de ejecucion

13/01/2005 - 02:01 por .:: MaStErDoN ::. | Informe spam
Hola,
quiero saber como se hace para compilar sierto codigo en tiempo de
ejecucion, o sea por ejemplo que un programa que se este ejecutando compile
el codigo de una dll por ejemplo

gracias..

andres

Preguntas similare

Leer las respuestas

#1 Pedro Luna Montalvo, MVP
13/01/2005 - 03:29 | Informe spam
Te incluyo un mensaje anterior que respondi sobre este mismo tema.
En el, se hacia referencia a que el codigo fuente se encontraba en una base
de datos, de donde se extraia y se queria ejecutar dinamicamente


From: "Pedro Luna Montalvo, MVP"
Newsgroups: microsoft.public.es.dotnet.vb
Sent: Monday, November 15, 2004 8:51 PM
Subject: Re: codigo almacenado


Saludos Gerardo,

Si bien no especificas en que lenguaje estaria escrito el codigo
almacenado, asumo que te refieres a VB.NET.

El siguiente es un simple codigo de una aplicacion de consola que te
muestra una alternativa.


Imports System.CodeDom.Compiler
Imports System.Reflection

Module Module1

' Esta funcion deberia retornar el codigo desde la base de datos
Function ObtenerCodigoDesdeBaseDatos() As String
Return "Class ClaseDinamica" & ControlChars.CrLf & _
"Sub Saludar(Mensaje As String)" &
ControlChars.CrLf & _
"System.Console.WriteLine(Mensaje)" &
ControlChars.CrLf & _
"End Sub" & ControlChars.CrLf & _
"End Class"
End Function


Sub Main()
' Obtener un CodeCompiler que corresponde a VB.NET
Dim Compilador As ICodeCompiler
Compilador = (New VBCodeProvider).CreateCompiler()

' Preparar las opciones del compilador
Dim parametros As New CompilerParameters()
parametros.GenerateInMemory = True ' Compilar en memoria!!!

' Compilar el código fuente!!
Dim resultado As CompilerResults
resultado = Compilador.CompileAssemblyFromSource(parametros,
ObtenerCodigoDesdeBaseDatos())

' Cargar el ensamblado y obtener el tipo
Dim tipo As Type =
resultado.CompiledAssembly.GetType("ClaseDinamica")

' Crear la instancia
Dim instancia As Object = Activator.CreateInstance(tipo)

' Invocar el método que muestra mensaje en consola
Dim metodo As MethodInfo = tipo.GetMethod("Saludar")
metodo.Invoke(instancia, New Object() {"Logramos compilar
codigo dinamicamente!!"})
End Sub
End Module

Espero te sirva


Saludos
Pedro Luna, [MVP VB.NET]
Gye, Ecu




".:: MaStErDoN ::." escribió en el mensaje
news:OQB9etQ%
Hola,
quiero saber como se hace para compilar sierto codigo en tiempo de
ejecucion, o sea por ejemplo que un programa que se este ejecutando
compile el codigo de una dll por ejemplo

gracias..

andres

Respuesta Responder a este mensaje
#2 Federico A. Colli
13/01/2005 - 15:28 | Informe spam
Hola a todos.
Continuando con este hilo, quiero agregarle algo más al assembly compilado
en ejecución.
Estoy mejorando unos assemblies genéricos, y justamente como son
genéricos(varían solamente en dos archivos XML incrustados) necesitaría
poder incrustar recursos también en el momento de la compilación.

Lo que hago con estos assemblies (dll) genéricos es cambiarles 2 archivos
XML de recursos que están incrustados manteniendo la misma clase, de forma
que no necesite crear diferentes proyectos para este propósito, dado que
actualmente no se cuantos pueden existir pero probablemente el numero se
incremente.
Luego, en la aplicación principal que hace uso de estas clases, obtengo la
lista (almacenados en una carpeta) de todos los assemblies "de este tipo",
recuperando la información que contiene cada uno mediante Reflection.
Mi idea es mejorar el proceso de generación de assemblies genéricos, de
forma que sólo necesite pasarle por parámetros la ruta de ambos archivos
incrustados y la ruta del archivo de resultado, nada más.

No se si es posible, busque un poco y no encontré referencias ni tampoco
miembros en las clases de System.CodeDom que permitan agregar archivos para
incrustarlos en el ensamblado. Tampoco en Assembly dado que solamente
permite obtener información de un ensamblado pero no agregar.

Bueno, no quiero alargarlo más, pero creo que es algo que a muchos les puede
servir.

Saludos y gracias de antemano.
Federico A. Colli
Analista Universitario de Sistemas


"Pedro Luna Montalvo, MVP" escribió en
el mensaje news:enxhBfR#
Te incluyo un mensaje anterior que respondi sobre este mismo tema.
En el, se hacia referencia a que el codigo fuente se encontraba en una


base
de datos, de donde se extraia y se queria ejecutar dinamicamente


From: "Pedro Luna Montalvo, MVP"
Newsgroups: microsoft.public.es.dotnet.vb
Sent: Monday, November 15, 2004 8:51 PM
Subject: Re: codigo almacenado


> Saludos Gerardo,
>
> Si bien no especificas en que lenguaje estaria escrito el codigo
> almacenado, asumo que te refieres a VB.NET.
>
> El siguiente es un simple codigo de una aplicacion de consola que te
> muestra una alternativa.
>
>
> Imports System.CodeDom.Compiler
> Imports System.Reflection
>
> Module Module1
>
> ' Esta funcion deberia retornar el codigo desde la base de datos
> Function ObtenerCodigoDesdeBaseDatos() As String
> Return "Class ClaseDinamica" & ControlChars.CrLf & _
> "Sub Saludar(Mensaje As String)" &
> ControlChars.CrLf & _
> "System.Console.WriteLine(Mensaje)" &
> ControlChars.CrLf & _
> "End Sub" & ControlChars.CrLf & _
> "End Class"
> End Function
>
>
> Sub Main()
> ' Obtener un CodeCompiler que corresponde a VB.NET
> Dim Compilador As ICodeCompiler
> Compilador = (New VBCodeProvider).CreateCompiler()
>
> ' Preparar las opciones del compilador
> Dim parametros As New CompilerParameters()
> parametros.GenerateInMemory = True ' Compilar en memoria!!!
>
> ' Compilar el código fuente!!
> Dim resultado As CompilerResults
> resultado = Compilador.CompileAssemblyFromSource(parametros,
> ObtenerCodigoDesdeBaseDatos())
>
> ' Cargar el ensamblado y obtener el tipo
> Dim tipo As Type > > resultado.CompiledAssembly.GetType("ClaseDinamica")
>
> ' Crear la instancia
> Dim instancia As Object = Activator.CreateInstance(tipo)
>
> ' Invocar el método que muestra mensaje en consola
> Dim metodo As MethodInfo = tipo.GetMethod("Saludar")
> metodo.Invoke(instancia, New Object() {"Logramos compilar
> codigo dinamicamente!!"})
> End Sub
> End Module
>
> Espero te sirva
>
>
> Saludos
> Pedro Luna, [MVP VB.NET]
> Gye, Ecu
>

".:: MaStErDoN ::." escribió en el mensaje
news:OQB9etQ%
> Hola,
> quiero saber como se hace para compilar sierto codigo en tiempo de
> ejecucion, o sea por ejemplo que un programa que se este ejecutando
> compile el codigo de una dll por ejemplo
>
> gracias..
>
> andres
>


Respuesta Responder a este mensaje
#3 Federico A. Colli
13/01/2005 - 16:29 | Informe spam
Ya lo encontre, aunque no me anda todavia porque no puedo generar la
Compilacion a disco, y además me dejaría a memoria pero la incrustación de
recursos supongo se debe hacer cuando se compila a disco.
Hay que agregar en el miembro CompilerOptions del objeto CompilerParameters
la opción de compilación por línea de comandos: "/resource:
archivo_a_incrustar"

Saludos
Federico A. Colli
Analista Universitario de Sistemas


"Federico A. Colli" escribió en el mensaje
news:#lg7kwX#
Hola a todos.
Continuando con este hilo, quiero agregarle algo más al assembly compilado
en ejecución.
Estoy mejorando unos assemblies genéricos, y justamente como son
genéricos(varían solamente en dos archivos XML incrustados) necesitaría
poder incrustar recursos también en el momento de la compilación.

Lo que hago con estos assemblies (dll) genéricos es cambiarles 2 archivos
XML de recursos que están incrustados manteniendo la misma clase, de forma
que no necesite crear diferentes proyectos para este propósito, dado que
actualmente no se cuantos pueden existir pero probablemente el numero se
incremente.
Luego, en la aplicación principal que hace uso de estas clases, obtengo la
lista (almacenados en una carpeta) de todos los assemblies "de este tipo",
recuperando la información que contiene cada uno mediante Reflection.
Mi idea es mejorar el proceso de generación de assemblies genéricos, de
forma que sólo necesite pasarle por parámetros la ruta de ambos archivos
incrustados y la ruta del archivo de resultado, nada más.

No se si es posible, busque un poco y no encontré referencias ni tampoco
miembros en las clases de System.CodeDom que permitan agregar archivos


para
incrustarlos en el ensamblado. Tampoco en Assembly dado que solamente
permite obtener información de un ensamblado pero no agregar.

Bueno, no quiero alargarlo más, pero creo que es algo que a muchos les


puede
servir.

Saludos y gracias de antemano.
Federico A. Colli
Analista Universitario de Sistemas


"Pedro Luna Montalvo, MVP" escribió


en
el mensaje news:enxhBfR#
> Te incluyo un mensaje anterior que respondi sobre este mismo tema.
> En el, se hacia referencia a que el codigo fuente se encontraba en una
base
> de datos, de donde se extraia y se queria ejecutar dinamicamente
>
>
> From: "Pedro Luna Montalvo, MVP"
> Newsgroups: microsoft.public.es.dotnet.vb
> Sent: Monday, November 15, 2004 8:51 PM
> Subject: Re: codigo almacenado
>
>
> > Saludos Gerardo,
> >
> > Si bien no especificas en que lenguaje estaria escrito el codigo
> > almacenado, asumo que te refieres a VB.NET.
> >
> > El siguiente es un simple codigo de una aplicacion de consola que te
> > muestra una alternativa.
> >
> >
> > Imports System.CodeDom.Compiler
> > Imports System.Reflection
> >
> > Module Module1
> >
> > ' Esta funcion deberia retornar el codigo desde la base de


datos
> > Function ObtenerCodigoDesdeBaseDatos() As String
> > Return "Class ClaseDinamica" & ControlChars.CrLf & _
> > "Sub Saludar(Mensaje As String)" &
> > ControlChars.CrLf & _
> > "System.Console.WriteLine(Mensaje)" &
> > ControlChars.CrLf & _
> > "End Sub" & ControlChars.CrLf & _
> > "End Class"
> > End Function
> >
> >
> > Sub Main()
> > ' Obtener un CodeCompiler que corresponde a VB.NET
> > Dim Compilador As ICodeCompiler
> > Compilador = (New VBCodeProvider).CreateCompiler()
> >
> > ' Preparar las opciones del compilador
> > Dim parametros As New CompilerParameters()
> > parametros.GenerateInMemory = True ' Compilar en memoria!!!
> >
> > ' Compilar el código fuente!!
> > Dim resultado As CompilerResults
> > resultado Compilador.CompileAssemblyFromSource(parametros,
> > ObtenerCodigoDesdeBaseDatos())
> >
> > ' Cargar el ensamblado y obtener el tipo
> > Dim tipo As Type > > > resultado.CompiledAssembly.GetType("ClaseDinamica")
> >
> > ' Crear la instancia
> > Dim instancia As Object = Activator.CreateInstance(tipo)
> >
> > ' Invocar el método que muestra mensaje en consola
> > Dim metodo As MethodInfo = tipo.GetMethod("Saludar")
> > metodo.Invoke(instancia, New Object() {"Logramos compilar
> > codigo dinamicamente!!"})
> > End Sub
> > End Module
> >
> > Espero te sirva
> >
> >
> > Saludos
> > Pedro Luna, [MVP VB.NET]
> > Gye, Ecu
> >
>
> ".:: MaStErDoN ::." escribió en el mensaje
> news:OQB9etQ%
> > Hola,
> > quiero saber como se hace para compilar sierto codigo en tiempo de
> > ejecucion, o sea por ejemplo que un programa que se este ejecutando
> > compile el codigo de una dll por ejemplo
> >
> > gracias..
> >
> > andres
> >
>
>


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida