2010-06-03 3 views
5

Мне сказали, что файлы сборки, созданные из C# и F # source, совместимы, поскольку они скомпилированы в сборку .NET.Интеграция C#, F #, IronPython и IronRuby

  • Q1: Означает ли это, что C# может вызывать функции F # так же, как и функции C#?
  • Q2: Как насчет IronPython и IronRuby? Я не вижу DLL сборки из IronPython/IronRuby.
  • Q3: Есть ли простой способ использовать функции IronPython/IronRuby с C# или F #?

Любой пример кода был бы замечательным.

ответ

5

1) Да. Используя простой пример, в F #, я могу вызвать основной метод в приложении # консольного C:

open SampleApp 

SampleApp.Program.Main([| "Hello"; "World" |]) 

2) Для DLR, я думаю, все немного по-другому. Я полагаю, что именно так вы должны выполнить Python (например);

ScriptEngine engine = Python.CreateEngine(); 
ScriptSource script = engine.CreateScriptFromSourceFile("myPythonScript.py"); 
ScriptScope scope = engine.CreateScope(); 

script.Execute(scope); 

Мое синтаксис может быть немного - но вы должны иметь возможность получить суть.

3) Вам необходимо загрузить некоторые DLR-библиотеки DLR, а затем ссылаться на них в приложении C#/F # для обеспечения совместимости. Они должны быть доступны с сайта Microsoft DLR.

3

мне сказали, что сборочные файлы , сделанные из C# и F # источника совместимы, поскольку они составлены в сборку .NET.

Да, вы можете ссылаться на сборку F # на одном C#. Объекты F # и т. Д. Будут работать как C#, когда вы ссылаетесь на них.

Вы также можете получить код IronPython/Ruby на C#, хотя он немного отличается от ссылки на сборку. Вот пример:

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

2

Q3: Есть ли простой способ использования функций IronPython/IronRuby с C# или F #?

Вы можете посмотреть на Embedding IronPython into a C# application

В принципе, то, что он делает (упрощенный код):

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