我正在尝试使用F#创建一个可移植的库,以便与Windows应用商店应用一起使用。我用一个类创建了一个fs文件:
module FunctionalRT
open System.Net
open System.IO
type WebHelper =
static member DownloadStringAsync (url:string) = async {
let req = HttpWebRequest.Create(url)
use! resp = req.AsyncGetResponse()
use stream = resp.GetResponseStream()
let reader = new StreamReader(stream)
let s = reader.ReadToEnd()
return s
}
我在Windows应用商店应用中引用了这个库,没有任何问题。但问题是,我无法访问FunctionalRT
模块WebHelper
类。当我写using FunctionalRT
或尝试使用FunctionalRT.WebHelper.FunctionalRT
时,编译器会抱怨它不知道它。可能是什么问题?
修改 经过几次补救和清理后我得到了
The type 'Microsoft.FSharp.Control.FSharpAsync`1<T0>' is defined in an assembly that is not referenced. You must add a reference to assembly 'FSharp.Core, Version=2.3.5.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. C:\Users\Igor\Documents\Visual Studio 2012\Projects\App3\App3\GroupedItemsPage.xaml.cs 46 13 App3
修改
添加对C:\Program Files (x86)\MSBuild\..\Reference Assemblies\Microsoft\FSharp\3.0\Runtime\.NETPortable\FSharp.Core.dll
的引用解决了上述错误消息,但还有另一个
Cannot await 'Microsoft.FSharp.Control.FSharpAsync<string>'
答案 0 :(得分:7)
您必须在Windows应用商店应用中引用此库才能使其正常工作:
C:\ Program Files(x86)\ Reference 组件\微软\ FSharp \ 3.0 \ Runtime.NETPortable \ FSharp.Core.dll
关于FSharpAsync类,请参阅此主题:
Referencing Asynchronous F# datatype from C#
您可以使用FSharpAsync类型的静态方法来等待返回的对象。
答案 1 :(得分:1)
如果您从C#调用此代码,它可能会更好地集成如下:
static member DownloadStringAsync (url:string) = async {
let req = HttpWebRequest.Create(url)
use! resp = req.AsyncGetResponse()
use stream = resp.GetResponseStream()
let reader = new StreamReader(stream)
let s = reader.ReadToEnd()
return s
} |> Async.StartAsTask
然后您的C#项目将不需要引用FSharp.Core,您可以使用标准C#await
关键字,就像调用C#异步代码一样。