5

我正在尝试使用 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 Store 应用程序中引用了这个库,没有任何问题。但问题是,我既不能访问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>'
4

2 回答 2

7

您必须在您的 Windows 应用商店应用程序中引用此库才能使其工作:

C:\Program Files (x86)\Reference Assemblies\Microsoft\FSharp\3.0\Runtime.NETPortable\FSharp.Core.dll

关于该 FSharpAsync 类,请参阅此线程:
从 C# 引用异步 F# 数据类型

您可以使用 FSharpAsync 类型的静态方法来等待返回的对象。

于 2012-10-25T08:42:49.017 回答
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# 异步代码一样。

于 2012-11-07T21:36:24.130 回答