none
Se Puede Cargar Codigo de un Texto | VB.NET RRS feed

  • Pregunta

  • >Hello, World!_

    Tengo la Siguiente Pregunta:

    ¿Puedo Agregar una Linea de Codigo desde un Archivo de Texto?

    Me Explico:

    En un Archivo de Texto se encuentre el siguiente Codigo

    If TextBox1.Text = "ST.Debug=AppName" Then
       RichTextBox1.AppendText(vbCrLf & "[ST]New Command: " & TextBox1.Text)
       AppName.Show()
       TextBox1.Clear()
    End If

    y que el Programa de VB.NET ejecute este Codigo del Archivo

    ¿Se Puede?

    y si es asi ¿Hay Alguna Forma?

    y si no ¿Que es lo mas Parecido?


    • Editado ElCris009 miércoles, 12 de abril de 2017 1:04 Faltaban Datos del Titulo
    miércoles, 12 de abril de 2017 1:01

Todas las respuestas

  • Sí, se puede pero no es muy sencillo. Puedes invocar al compilador de VB.NET, que se expone como clase dentro del Framework, y entre los varios parámetros que se le pueden pasar hay uno que se llama CompileInMemory, que te devuelve un objeto con el código que ha compilado. Ese objeto después puedes invocarlo por reflexión. El efecto neto es que lo que había en el archivo se ejecuta en memoria después de tomar los pasos anteriores.

    Se complicará un poco porque es necesario que lo que tomas del archivo sea algo que compile correctamente, por lo que no pueden ser unas líneas de código "sueltas", sino que hay que meterlas dentro de un método dentro de una clase. Esto puedes hacerlo concatenando esas "piezas" alrededor de las líneas leídas del fichero. Y si en el código cargado necesitas acceder a algo externo, como por ejemplo el textBox1 que hay en el fragmento que pegaste, entonces esos datos hay que pasárselo como argumento al encapsulado que añadiste, en el momento de invocarlo por reflexión.

    Si eso lo tienes que hacer repetidamente cargando sobre la marcha muchos fragmentos de muchos archivos que van cambiando, se presenta otro problema adicional: cada vez que compilas uno y lo cargas en memoria, se genera un nuevo ensamblado, que nunca se descarga de la memoria salvo que se descargue el AppDomain que lo contiene. Por eso, si vas a cargar muchos, conviene que los cargues en un AppDomain separado, para poderlo descargar. Esto complica la llamada por Reflexión, que tiene que hacer un salto entre AppDomains y requiere encapsular los argumentos en una clase que admita al Marshalling entre AppDomains.

    Todas estas cosas funcionan muy bien una vez que las tienes escritas, pero como ves son varios temas de una complejidad considerable y que tendrías que estudiar, no es un tema trivial que se resuelva con dos líneas de código.

    miércoles, 12 de abril de 2017 5:52