2014-02-24 81 views
4

我使用F#CompilerServices舉辦一個.NET腳本環境,我的應用程序,類似於這裏的例子:F#互動服務:如何在.NET對象通過從主機

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

如果我評估一個表達式(EvalExpression)將數據整理回主機應用程序,但沒有明顯的方式將數據傳遞到相反的方向。

如何將.NET對象從主機應用程序傳遞到腳本環境?

回答

3

這對於F#交互式服務公開的API來說是一個很好的補充!

我想最簡單的解決方法是定義一些集合用於存儲要在通過內部 F#交互會話參數:

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

然後你可以用EvalExpression得到一個函數,存儲在字典中的值:

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

主持人可以那麼返回的對象轉換爲string -> obj -> unit並用它來設置參數,這將是在c訪問在服務內部運行..

編輯:由於某種原因,我不知道,上述不起作用。但是,您可以將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))") 
相關問題