我正在使用F#CompilerServices在我的应用程序中托管.NET脚本环境,类似于此处的示例:
https://github.com/fsharp/FSharp.Compiler.Service/blob/master/samples/InteractiveService/Program.fs
如果我评估表达式(EvalExpression
),数据会被编组回主机应用程序,但没有明显的方法可以向相反方向传递数据。
如何将.NET对象从主机应用程序传递到脚本环境?
答案 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))")