2010-06-03 14 views
5

Me dijeron que los archivos de ensamblaje elaborados a partir de fuentes C# y F # son interoperables, ya que se compilan en el ensamblado de .NET.Integración de C#, F #, IronPython e IronRuby

  • Q1: ¿Eso significa que C# puede llamar a las funciones F # al igual que son funciones C#?
  • Q2: ¿Qué tal el IronPython y IronRuby? No veo ningún dll de ensamblaje de IronPython/IronRuby.
  • Q3: ¿Hay alguna manera fácil de usar las funciones IronPython/IronRuby desde C# o F #?

Cualquier código de ejemplo sería genial.

Respuesta

5

1) Sí. Utilizando un simple ejemplo, en C#, 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 sintaxis puede estar un poco desviada, pero debería ser capaz de obtener la esencia.

3) Debe descargar algunas DLL DLR especiales, y luego hacer referencia a ellas en su aplicación C#/F # para que sean interoperables. Deberían estar disponibles en el sitio DLR de Microsoft.

3

me dijeron que los archivos de ensamblaje hechos de C# y F # fuente es interoperable ya que se recopilan en el conjunto de .NET.

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

También puede acceder al código de IronPython/Ruby en C#, aunque es un poco diferente a solo hacer referencia a un ensamblaje. Aquí está un ejemplo:

http://www.highoncoding.com/Articles/573_First_Look_at_the_IronRuby.aspx

2

Q3: ¿Hay alguna manera fácil de utilizar las funciones de IronPython/IronRuby desde C# o F #?

Es posible echar un vistazo a Embedding IronPython into a C# application

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")); 
Cuestiones relacionadas