2012-10-25 13 views
5

Windowsストアアプリで使用するためにF#を使用して移植可能なライブラリを作成しようとしています。WindowsストアアプリとF#

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ストアアプリでこのライブラリを参照しても問題はありません。しかし、問題は、WebHelperクラスではなくFunctionalRTモジュールにアクセスできないということです。 using FunctionalRTを書き込むか、FunctionalRT.WebHelper.FunctionalRTを使用しようとすると、コンパイラはそれがわからないと訴えます。何が問題なのでしょうか?

EDIT:少数buidls後 及びIは

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 

を取得クリーンEDIT:

C:\Program Files (x86)\MSBuild\..\Reference Assemblies\Microsoft\FSharp\3.0\Runtime\.NETPortable\FSharp.Core.dllへの参照を追加するには、上記のエラーメッセージを解決したが、別の

があります
Cannot await 'Microsoft.FSharp.Control.FSharpAsync<string>' 
+0

すべての参照(.Netとサードパーティの両方)がWinRTと互換性があることを確認しましたか? –

+0

Windows 8アプリケーション(App3)とF#ポータブルライブラリ(FunctionalRTとターゲットフレームワーク:Windowsストアアプリケーション用の.NET、.NET Framework 4.5、Silverlight 5)、App3はFunctionalRTに対してReferebceを持っています。 –

+0

私はこのエラーメッセージによると、C#プロジェクトはFSharp.Core(もちろんWinRTバージョン)も参照する必要があります。私は現在F#プロジェクトだけがFSharp.Coreを参照していると仮定していますか?私が正しければ、このエラーは通常のC#-F#アプリケーションを書くときにも現れます。 –

答えて

7

それを動作させるためにあなたのWindowsストアアプリでこのライブラリをフェレンス:

C:\プログラムファイル(x86の)\リファレンス アセンブリ\マイクロソフト\ FSharp \ 3.0 \ Runtime.NETPortable \ FSharp.Core.dll

そしてFSharpAsyncクラスは、このスレッドを見ていることについて:
Referencing Asynchronous F# datatype from C#

あなたが返されたオブジェクトを待っているためFSharpAsync型の静的メソッドを使用することができます。

+0

私は幸せな部分を理解しましたが、リンクのおかげで、それは助けになりました –

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#非同期コードを呼び出していました。

関連する問題