F#交互式服务:如何从主机传递.NET对象

时间:2014-02-24 11:10:58

标签: f#

我正在使用F#CompilerServices在我的应用程序中托管.NET脚本环境,类似于此处的示例:

https://github.com/fsharp/FSharp.Compiler.Service/blob/master/samples/InteractiveService/Program.fs

如果我评估表达式(EvalExpression),数据会被编组回主机应用程序,但没有明显的方法可以向相反方向传递数据。

如何将.NET对象从主机应用程序传递到脚本环境?

1 个答案:

答案 0 :(得分:3)

这将是F#Interactive服务公开的API的一个很好的补充!

我想最简单的解决方法是定义一些集合,用于存储您希望在内部 F#交互式会话中传递的参数:

let parameters = new System.Collections.Generic.Dictionary<string, obj>()

然后您可以使用EvalExpression来获取在字典中存储值的函数:

(fun k v -> parameters.Add(k, v))

然后主机可以将返回的对象强制转换为string -> obj -> unit并使用它来设置可在服务内运行的代码中访问的参数。

编辑:出于某种原因,我不知道,上面的内容并不完全有效。但是,您可以将F#函数包装在.NET委托中,然后它可以正常工作。或者,您可以只计算表达式parameters并返回整个字典(然后您可以直接存储值)。

这对我有用:

fsiSession.EvalInteraction
  ("let env = new System.Collections.Generic.Dictionary<string, obj>()")
fsiSession.EvalExpression
  ("System.Action<string, obj>(fun k v -> env.Add(k, v))")