Интеграция C#, F#, Ironpython и Ironruby
-
24-10-2019 - |
Вопрос
Мне сказали, что файлы сборки, сделанные из источника C# и F#, совместимы, поскольку они составлены в сборку .NET.
- Q1: Значит ли это, что C# может вызывать функции F# так же, как они являются функциями C#?
- Q2: Как насчет Ironpython и Ironruby? Я не вижу в сборе DLL из Ironpython/Ironruby.
- Q3: Есть ли простой способ использовать функции Ironpython/Ironruby от C# или F#?
Любой пример кода был бы отличным.
Решение
1) Да. Используя простой пример, в F# я могу вызвать основной метод приложения C# Console:
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 DLLS - и затем ссылаться на них в приложении C# / F#, чтобы быть совместимым. Они должны быть доступны на сайте Microsoft DLR.
Другие советы
Мне сказали, что файлы сборки, сделанные из источника C# и F#, совместимы, поскольку они составлены в сборку .NET.
Да, вы можете ссылаться на сборку F# в C# One. Объекты F# и т. Д. Будут функционировать как C# One при их ссылке.
Вы также можете получить доступ к коду Ironpython/Ruby в C#, хотя он немного отличается от простого ссылки на сборку. Вот пример:
http://www.highoncoding.com/articles/573_first_look_at_the_ironruby.aspx
Q3: Есть ли простой способ использовать функции 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"));