Вопрос

Мне сказали, что файлы сборки, сделанные из источника 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"));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top