Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





ScriptControl en VB NET

Iniciado por Hechelion, 26 de Agosto de 2012, 09:32:39 PM

« anterior - próximo »

Hechelion

Saludos.

Tengo una duda, antiguamente, en vb6, se podía agregar un control, llamado MS Scriptcontrol, el cual permitía ejecutar script de vb en la aplicación.
Leyendo sobre el tema, encontré que el mismo control sirve en NET y traté de implementarlo y aunque en un principio me funciona bien, no me quiere aceptar los objetos creados a partir de clases creadas por mi (y es el motivo por el cual quiero usarlo)


Me explico en detalle, para las pruebas, tengo un formulario con dos objetos, un textbox (textbox1) y un button (button1). Cuando presione el botón voy a ejecutar el código escrito en el textbox y lo que haré es cambiar el texto del botón.

Código (net) [Seleccionar]

Public Class Form1
   Dim script1 As MSScriptControl.ScriptControl
   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       script1 = New MSScriptControl.ScriptControl
       script1.Language = "VBScript"
       script1.AddObject("button1", Button1)

   End Sub

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
       script1.AddCode(TextBox1.Text)
       script1.ExecuteStatement("main")
   End Sub
End Class


Y el script que escribo en el textbox es el siguiente:

sub main
button1.text = "Probando"
end sub


Hasta acá, tanto en NET como en VB6 me funciona sin problema alguno, con lo cual sé que el scriptcontrol funciona y me permite modificar las propiedades de los objetos.


Mis problemas comienzan cuando creo un objeto a partir de una clase creada por mi.
Código (net) [Seleccionar]

Public Class ClsPrueba
   Public texto As String
End Class

Public Class Form1
   Dim script1 As MSScriptControl.ScriptControl
   Dim oPrueba As ClsPrueba
   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       script1 = New MSScriptControl.ScriptControl
       oPrueba = New ClsPrueba
       oPrueba.texto = "Valor inicial"
       script1.Language = "VBScript"
       script1.AddObject("button1", Button1)
       script1.AddObject("oPrueba", oPrueba)

   End Sub

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
       script1.AddCode(TextBox1.Text)
       script1.ExecuteStatement("main")
   End Sub
End Class


y el script:

sub main
button1.text = "probando"
msgbox "Paramos código"

oPrueba.texto = "Cambiando valor"
end sub


En este caso, vb6 ejecuta todo sin problema, pero en NET no, me dice "Object required: 'oPrueba'" como si no hubiera podido agregar el objeto oPrueba, y si mi clase es más compleja (con procedimientos y funciones) me arroja InvalidCastExecption cuando intento agregar el objeto al script.

Asumo que el problema será que el control scriptcontrol es muy antiguo y no compatible del todo con NET, así que la pregunta es si ¿existe algo similar para VB NET o alguna forma de agregar script a un juego creado en NET?.
Estuve tratando de buscar, pero sin éxito.

[EX3]

Cita de: Hechelion en 26 de Agosto de 2012, 09:32:39 PM
Asumo que el problema será que el control scriptcontrol es muy antiguo y no compatible del todo con NET, así que la pregunta es si ¿existe algo similar para VB NET o alguna forma de agregar script a un juego creado en NET?.
Estuve tratando de buscar, pero sin éxito.
Me ha costado encontrar la pagina de la de años que hace que no la visito pero di con ella. Hace tiempo estuve buscando informacion tambien sobre como aprovechar .NET como motor propio para ejecutar scripts y encontre esta librería que te permite implementar un sistema de scripting utilizando C# como lenguaje (supongo que se debería poder adaptar para que funcionara con VB.NET) y como limitar la accion del codigo que puede ejecutar, por ejemplo, que no pueda operar con las funciones de archivos para evitar borrar archivos mediante el script o que solo pueda ejecutar llamadas contra ciertos espacios de nombres:

http://www.mdxinfo.com/resources/scripting.php

Olvidate del MS Script Control en .NET como muchos otros componentes que trabajen a ese nivel. La interoperabilidad COM/ActiveX de .NET hace sus pinitos pero no va tan fino como en nativo. Piensa que .NET tiene unas funcionalidades que permiten compilar y ejecutar codigo en tiempo real y encima con la posibilidad de comunicarlo con el codigo de un programa ya compilado, por lo que te permite hacer virguerias como cargar codigo C# de un archivo TXT en la memoria de tu programa en ejecución, compilarlo al vuelo y que este realice llamadas a los objetos de tu programa o a donde le permitas acceder, como si fuera una parte más de tu programa.

Espero que te sirva. Yo nunca llegue a trabajar con esta libreria pero las ganas ahi quedaron y más ahora que he reencontrado la web :)

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Hechelion

Es justamente lo que estaba buscando. Mil gracias ex3, voy a mirarlo con calma para tratar de implementarlo en vb net, ya que lo quiero para dhu nun. Como ahora los niveles están definidos como archivos de texto externos, necesitaba un sistema de script para los eventos de cada nivel.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.