Integración de C #, F #, IronPython y IronRuby

Me dijeron que los archivos de ensamblaje hechos de origen C # y F # son interoperables, ya que se comstackn en ensamblado .NET.

  • P1: ¿Eso significa que C # puede llamar a funciones de F # tal como son funciones de C #?
  • P2: ¿Qué hay de IronPython y IronRuby? No veo ningún archivo DLL de ensamblado de IronPython / IronRuby.
  • P3: ¿Existe alguna forma fácil de usar las funciones IronPython / IronRuby desde C # o F #?

Cualquier código de ejemplo sería genial.

1) si. Usando un ejemplo simple, en F #, puedo invocar el método principal de una aplicación de consola de 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 syntax puede estar un poco apagada, pero deberías poder entender la esencia.

3) Debe descargar algunas DLL DLR especiales, y luego consultarlas en su aplicación C # / F # para que sean interoperables. Deben estar disponibles en el sitio de Microsoft DLR.

Me dijeron que los archivos de ensamblaje hechos de origen C # y F # son interoperables, ya que se comstackn en ensamblado .NET.

Sí, puede hacer referencia a un ensamblaje de F # en uno de C #. Los objetos F #, etc., funcionarán como los de C # cuando haga referencia a ellos.

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: ¿Existe alguna forma fácil de usar las funciones IronPython / IronRuby desde C # o F #?

Puede echar un vistazo a Incrustar IronPython en una aplicación de 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 foo = scope.GetVariable>("foo"); //Execute it Console.WriteLine(foo("a"));