2009-08-28 10 views
9

Gracias a las sugerencias de previous question, estoy ocupado probando IronPython, IronRuby y Boo para crear una DSL para mi aplicación C#. El primer paso es IronPython, debido a la mayor base de usuarios y conocimiento. Si puedo hacer que algo funcione bien aquí, puedo parar.Simplfing DSL escrito para una aplicación C# con IronPython

Aquí está mi problema:

quiero mi guión IronPython para tener acceso a las funciones de una clase llamada Lib. En este momento puedo agregar el ensamblado al tiempo de ejecución IronPython e importar la clase ejecutando la sentencia en el ámbito creé:

// load 'ScriptLib' assembly 
Assembly libraryAssembly = Assembly.LoadFile(libraryPath); 
_runtime.LoadAssembly(libraryAssembly); 

// import 'Lib' class from 'ScriptLib' 
ScriptSource imports = _engine.CreateScriptSourceFromString("from ScriptLib import Lib", SourceCodeKind.Statements); 
imports.Execute(_scope); 

// run .py script: 
ScriptSource script = _engine.CreateScriptSourceFromFile(scriptPath); 
script.Execute(_scope); 

si quiero correr Lib :: imprimirHola, que es sólo una declaración de estilo hola mundo , mi script Python contiene:

Lib.PrintHello() 

o (si no es estática):

library = new Lib() 
library.PrintHello() 

¿Cómo puedo cambiar mi entorno por lo que sólo puede tener statments básicos en la secuencia de comandos de Python como Thi s:

PrintHello 
TurnOnPower 
VerifyFrequency 
TurnOffPower 
etc... 

Quiero estos scripts para ser simples para un no-programador escribir. No quiero que tengan que saber qué es una clase o cómo funciona. IronPython está realmente allí para que algunas operaciones básicas como for, do, if y una definición básica de funciones no requieran que escriba un compilador para mi DSL.

+0

Se ve aún más feo en IronRuby donde tengo que escribir ScriptLib :: Lib.PrintHello() ¿Hay alguien familiarizado con cualquiera IronRuby o IronPython de esta manera? ¿Necesito un script de configuración de python para mapear todos los métodos/variables antes de ejecutar un script de prueba? Tenía la esperanza de hacer esto en C#. – cgyDeveloper

Respuesta

19

Usted debe ser capaz de hacer algo como:

var objOps = _engine.Operations; 
var lib = new Lib(); 

foreach (string memberName in objOps.GetMemberNames(lib)) { 
    _scope.SetVariable(memberName, objOps.GetMember(lib, memberName)); 
} 

Esto hará que todos los miembros de la objec lib y luego inyectarlos en la ScriptScope. Esto se hace con la clase Python ObjectOperations para que los miembros que obtienes sean miembros de Python. Entonces, si luego haces algo similar con IronRuby, el mismo código debería funcionar.

+1

Gracias! Ojalá pudiera dar múltiples votos, no pude encontrar una forma de obtener funciones en el alcance en cualquier lugar. – cgyDeveloper

+0

Parece que esto podría no funcionar en IronRuby. No creo que sea compatible con los miembros independientes. Lo mejor que puedo obtener por ahora es lib.PrintHello. – cgyDeveloper

+1

@cygDeveloper no se preocupe, agregué un voto adicional a la respuesta, definitivamente es el camino a seguir, también creamos un DSL para nuestras aplicaciones de esta manera – TimothyP

Cuestiones relacionadas