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.

¿Fue útil?

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"));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top