Integración de C#, F#, Ironpython y Ironruby
-
24-10-2019 - |
Pregunta
Me dijeron que los archivos de ensamblaje hechos de la fuente C# y F# son interoperables, ya que se compilan en el ensamblaje de .NET.
- P1: ¿Eso significa que C# puede llamar a las funciones F# al igual que son las funciones de C#?
- P2: ¿Qué tal el Ironpython y Ironruby? No veo ningún DLL de ensamblaje del Ironpython/Ironruby.
- P3: ¿Hay alguna manera fácil de usar funciones de Ironpython/Ironruby de C# o F#?
Cualquier código de ejemplo sería genial.
Solución
1) Sí. Usando un ejemplo simple, en f#, puedo invocar el método principal de una aplicación de consola C#:
open SampleApp
SampleApp.Program.Main([| "Hello"; "World" |])
2) Para el DLR, creo que las cosas son un poco diferentes. Creo que así es como ejecutarías Python (por ejemplo);
ScriptEngine engine = Python.CreateEngine();
ScriptSource script = engine.CreateScriptFromSourceFile("myPythonScript.py");
ScriptScope scope = engine.CreateScope();
script.Execute(scope);
Mi sintaxis puede estar fuera de lugar, pero deberías poder conseguir la esencia.
3) Debe descargar algunos DLL de DLR especiales, y luego hacer referencia a su aplicación C# / F# para ser interoperable. Deberían estar disponibles en el sitio de Microsoft DLR.
Otros consejos
Me dijeron que los archivos de ensamblaje hechos de la fuente C# y F# son interoperables, ya que se compilan en el ensamblaje de .NET.
Sí, puede hacer referencia a un ensamblaje F# en un C# uno. Los objetos F#, etc., funcionarán como C# cuando los haga referencia.
También puede acceder al código Ironpython/Ruby en C#, aunque es un poco diferente a solo hacer referencia a un ensamblaje. Aquí hay un ejemplo:
http://www.highoncoding.com/articles/573_first_look_at_the_ironruby.aspx
P3: ¿Hay alguna manera fácil de usar funciones de Ironpython/Ironruby de C# o F#?
Es posible que eches un vistazo a Incrustar Ironpython en una aplicación C#
Básicamente, lo que hace (código simplificado):
var engine = Python.CreateEngine();
var scriptSource = engine.CreateScriptSourceFromString(@"
def foo(s):
print s", SourceCodeKind.Statements);
var scope = engine.CreateScope();
scriptSource.Execute(scope);
//Get a reference to the function
Func<string, decimal> foo = scope.GetVariable<Func<string, decimal>>("foo");
//Execute it
Console.WriteLine(foo("a"));