2012-10-25 21 views
5

Próbuję utworzyć bibliotekę przenośną za pomocą klawisza F #, która będzie używana w aplikacjach Windows Store. Stworzyłem jeden plik fs z jedną klasą:Aplikacje Windows Store i 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 
    } 

Odwołałem się do tej biblioteki w mojej aplikacji Windows Store bez żadnych problemów. Ale problem polega na tym, że nie mam dostępu do modułu FunctionalRT ani do klasy WebHelper. Kiedy piszę using FunctionalRT lub spróbuję użyć FunctionalRT.WebHelper.FunctionalRT, kompilator narzeka, że ​​go nie zna. Jaki może być problem?

EDIT: Po kilku buidls i czyści uzyskać

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:

dodanie odniesienia do C:\Program Files (x86)\MSBuild\..\Reference Assemblies\Microsoft\FSharp\3.0\Runtime\.NETPortable\FSharp.Core.dll rozwiązać powyższy komunikat o błędzie, ale jest jeszcze jeden

Cannot await 'Microsoft.FSharp.Control.FSharpAsync<string>' 
+0

Czy upewniłeś się, że wszystkie twoje referencje (zarówno .Net, jak i strona trzecia) są kompatybilne z WinRT? –

+0

Istnieją tylko 2 projekty: aplikacja Windows 8 (App3) i przenośna biblioteka F # (FunctionalRT ze strukturą Target: .NET dla aplikacji Windows Store, .NET Framework 4.5, Silverlight 5) i App3 mają odwołanie do FunctionalRT –

+0

Wierzę, że błąd wiadomość mówi, że projekt C# powinien również odwoływać się do FSharp.Core (oczywiście wersji WinRT). Zakładam, że teraz tylko projekt F # odwołuje się do FSharp.Core? Jeśli mam rację, ten błąd pojawiłby się również podczas pisania zwykłej aplikacji C# -F #. –

Odpowiedz

7

Musisz ponownie Ferenc tej biblioteki w aplikacji systemu Windows Store, aby to działało:

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

A odnośnie tej klasy FSharpAsync, zobacz ten wątek:
Referencing Asynchronous F# datatype from C#

można użyć metody statycznej typu FSharpAsync dla oczekujących zwrócony obiekt.

+0

Wymyśliłem pierwszą część, ale dzięki za link, pomogło –

1

Jeśli dzwonisz tego kodu z C#, to prawdopodobnie zintegrować lepiej tak:

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 

Następnie projekt C# nie trzeba będzie odwoływać FSharp.Core, i można użyć standardowej C# await słowo kluczowe tak, jakbyś wywoływał kod asynchroniczny C#.

Powiązane problemy