¿Hay alguna forma de que este escenario funcione?Crear scripts de Python y llamar a métodos desde C#
Hay una secuencia de comandos de Python. Está construido en un archivo DLL mediante la ejecución de este script con IronPython:
import clr
clr.CompileModules("CompiledScript.dll", "script.py")
El objetivo es llamar a los métodos de esta DLL de código C#. .NET Reflector muestra que hay una clase en la DLL - DLRCashedCode
y los métodos que nos interesan son los métodos estáticos privados de esta clase.
Por ejemplo, hay una función en el guión:
def scriptMethod(self, text):
...
Su representación en la DLL es:
private static object scriptMethod(Closure closure1, PythonFunction $function, object self, object text)
{
...
}
Closure
y PythonFunction
son clases IronPython (de Microsoft.Scripting.dll y IronPython.dll).
Hasta ahora todo bien. ¿Es posible que este método sea llamado por el código C#? La idea de utilizar la reflexión como
Type t = typeof(DLRCachedCode);
string methodName = "scriptMethod";
MethodInfo method = t.GetMethod(methodName, BindingFlags.NonPublic | BindingFlags.Static);
object[] parameters = new object[] { "param1", "param2" }; // the "params problem"
method.Invoke(null, parameters);
parece más difícil debido a la configuración de los parámetros del método. Si son (de cualquier manera) inicializados correctamente, ¿podríamos esperar que el método funcione sin problemas?
¿Existe alguna forma mejor de llamar a este método desde C#? Por diversos motivos, preferimos tener el script creado como un ensamblado .NET y no llamar al script en sí.
La respuesta de Jeff Hardy me hace preguntarme si no hay una forma más directa de usar la clase compilada dll/python desde un ScriptEngine ... – djlawler
Simplifiqué un poco el código y agregué una llamada al método python. Además, encontré esto (que podría ser útil): http://codingbox.blogspot.com/2009_11_01_archive.html – djlawler
Visite http://pastie.org/797185 para obtener una forma más directa de hacerlo. –