Интеграция C #, F #, IronPython и IronRuby - PullRequest
5 голосов
/ 03 июня 2010

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

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

Любой пример кода был бы великолепен.

Ответы [ 3 ]

5 голосов
/ 03 июня 2010

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, а затем сослаться на них в приложении C # / F # для обеспечения совместимости.Они должны быть доступны на сайте Microsoft DLR.

3 голосов
/ 03 июня 2010

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

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

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

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

2 голосов
/ 04 июня 2010

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

Вы можете взглянуть на Встраивание IronPython в приложение C #

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

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