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

F#交互式服务:如何从主机传入.NET对象,f#,F#,我正在使用F#CompilerServices在我的应用程序中托管一个.NET脚本环境,类似于下面的示例: 如果我计算一个表达式(EvalExpression),数据将被编组回主机应用程序,但没有明显的方法以相反的方向传递数据 如何将.NET对象从主机应用程序传递到脚本环境中?这将是对F#Interactive services公开的API的极大补充 我想最简单的解决方法是定义一些集合来存储要在F#交互式会话中传递的参数: let parameters = new System.Collect

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

如果我计算一个表达式(
EvalExpression
),数据将被编组回主机应用程序,但没有明显的方法以相反的方向传递数据


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

这将是对F#Interactive services公开的API的极大补充

我想最简单的解决方法是定义一些集合来存储要在F#交互式会话中传递的参数:

let parameters = new System.Collections.Generic.Dictionary<string, obj>()
然后,主机可以将返回的对象强制转换为
string->obj->unit
,并使用它设置可以在服务内部运行的代码中访问的参数

编辑:由于某种原因,我不知道,上述方法不太有效。但是,您可以将F#函数包装在.NET委托中,然后它就可以正常工作了。或者,您可以只计算表达式
参数
,然后返回整个字典(然后您可以直接将值存储在那里)

这对我来说是个好办法:

fsiSession.EvalInteraction
  ("let env = new System.Collections.Generic.Dictionary<string, obj>()")
fsiSession.EvalExpression
  ("System.Action<string, obj>(fun k v -> env.Add(k, v))")
fsiSession.EvalInteraction
(“let env=new System.Collections.Generic.Dictionary()”)
外泄
(“系统操作(fun k v->环境添加(k,v)))
fsiSession.EvalInteraction
  ("let env = new System.Collections.Generic.Dictionary<string, obj>()")
fsiSession.EvalExpression
  ("System.Action<string, obj>(fun k v -> env.Add(k, v))")