5

F# を使用して Windows ストア アプリで使用するポータブル ライブラリを作成しようとしています。1 つのクラスで 1 つの 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>'
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 を参照する必要がなくなり、awaitC# 非同期コードを呼び出しているかのように、標準の C# キーワードを使用できます。

于 2012-11-07T21:36:24.130 に答える