2016-01-18 15 views
6

pracuję na przykładzie Osadzanie F # Interactive z http://fsharp.github.io/FSharp.Compiler.Service/interactive.html ale mam problem z następującą linią wyrzucanie wyjątek:Osadzanie F # Interaktywna Przykład rzucanie wyjątek od FSharp.Compiler.Service

let fsiSession = FsiEvaluationSession.Create(fsiConfig, allArgs, inStream, outStream, errStream) 

Wyjątkiem jest wyrzucane :

"wystąpił nieobsługiwany wyjątek typu 'System.Exception' wystąpił w FSharp.Compiler.Service.dll informacje dodatkowe: błąd podczas tworzenia sesji testowej: StopProcessing null"

Mój projekt jest uruchamiany z VS2015 Enterprise Update 1, skonfigurowany jako prosta aplikacja konsoli F #, z runtime Target F # będącym F # 4.0 z Target Framework jako 4.6. Wersja FSharp.Compiler.Service pobrana z nuget to 2.0.0.2.

Kod plik Program.Fs Używam jest tutaj (bezpośredni port przykład):

open System 
open System.IO 
open System.Text 
open Microsoft.FSharp.Compiler.SourceCodeServices 
open Microsoft.FSharp.Compiler.Interactive.Shell 

[<EntryPoint>] 
let main argv = 

    let sbOut = new StringBuilder() 
    let sbErr = new StringBuilder() 
    let inStream = new StringReader("") 
    let outStream = new StringWriter(sbOut) 
    let errStream = new StringWriter(sbErr) 

    // Build command line arguments & start FSI session 
    let argv = [| "C:\\fsi.exe" |] 
    let allArgs = Array.append argv [|"--noninteractive"|] 

    let fsiConfig = FsiEvaluationSession.GetDefaultConfiguration() 
    let fsiSession = FsiEvaluationSession.Create(fsiConfig, allArgs, inStream, outStream, errStream) 

    /// Evaluate expression & return the result 
    let evalExpression text = 
     match fsiSession.EvalExpression(text) with 
     | Some value -> printfn "%A" value.ReflectionValue 
     | None -> printfn "Got no result!" 

    evalExpression "42+1" // prints '43' 

    Console.ReadLine() |> ignore 

    0 // return integer 

Wszelkie myśli będą mile widziane.

+0

[Czym są F # pliki FSharp.Core.optdata i FSharp.Core.sigdata?] (Http://stackoverflow.com/questions/21224314/what-are-fs-fsharp-core-optdata-and-fsharp- core-sigdata-files) –

Odpowiedz

6

Kluczem do problemu znaleźć na Compiler Services: Notes on FSharp.Core.dll

Jeśli robi dynamicznej kompilacji i wykonanie może trzeba także jak FSharp.Core.optdata i FSharp.Core.sigdata, patrz poniżej kierunkiem .

Podczas tworzenia aplikacji katalog wyjście z FSharp.Core.dll brakuje dwóch plików:

FSharp.Core.optdata 
FSharp.Core.sigdata 

będzie trzeba znaleźć te dwa pliki i poprawne wersje plików, które zgadzają się z FSharp.Core. dll i skopiuj je do katalogu wyjściowego kompilacji.

Jak znaleźć pliki przy użyciu programu Visual Studio

Z menu Widok -> Rozwiązanie Explorer
Rozwiń Projekt
Expand Referencje
Kliknij prawym przyciskiem FSharp.Core i wybierz Właściwości.

enter image description here

daje pełną ścieżkę do katalogu, który powinien mieć co najmniej trzy pliki. Użyj eksploratora plików, aby otworzyć katalog w pełnej ścieżce.

enter image description here

skopiować dwa pliki

FSharp.Core.optdata 
FSharp.Core.sigdata 

do katalogu zbudować.

Jak znaleźć katalog budowy przy użyciu Visual Studio

Z menu Widok -> Solution Explorer
Wybierz projekt
F4, aby otworzyć Właściwości Page

enter image description here

Projekt Folder z \bin\Debug jest domyślny podczas debugowania za pomocą VS.

Zmień lokalizację fsi.exe

teraz, że masz dwie potrzebne pliki będzie trzeba także zmienić lokalizację fsi.exe

let argv = [| "C:\\fsi.exe" |] 

bo wątpię, że fsi.exe znajduje się w katalogu głównym dysku C.

+1

Dzięki. To zadziałało. –

+0

Świetne wyjaśnienie, ale nadal mam ten sam błąd po skopiowaniu plików. – Wingjam

+0

Zobacz -> https://stackoverflow.com/q/48710880/5154345 – Wingjam

Powiązane problemy