2016-01-18 13 views
6

ich arbeite durch die Embedding F # Interactive Beispiel aus http://fsharp.github.io/FSharp.Compiler.Service/interactive.html aber ein Problem mit der folgenden Zeile habe eine Ausnahme werfen:Embedding F # Interactive Beispiel Werfen Ausnahme von FSharp.Compiler.Service

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

Die geworfene Ausnahme :

"Eine nicht behandelte Ausnahme des Typs 'System.Exception' trat in FSharp.Compiler.Service.dll Zusätzliche Informationen: Fehlerauswertung Sitzung erstellt: Stopprocessing null"

Mein Projekt wird von VS2015 Enterprise Update 1 ausgeführt, das als einfache F # -Konsolen-App eingerichtet wird, wobei die Ziel-F # -Laufzeit F # 4.0 mit dem Zielframework wie 4.6 ist. Die Version von FSharp.Compiler.Service, die von nugget heruntergeladen wird, ist 2.0.0.2.

Der Program.Fs Datei Code bei ich laufe ist hier (ein direkter Anschluss des Beispiels):

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 

Irgendwelch Gedanken geschätzt würden.

+0

[Wie lauten die FSharp.Core.optData - und FSharp.Core.sigdata - Dateien von F #?] (Http://StackOverflow.com/questions/21224314/what-are-fs-harshar-p-core-optdata-and-fsharp- Core-SIGDATA-Dateien) –

Antwort

6

Der Schlüssel zu Ihrem Problem bei Compiler Services: Notes on FSharp.Core.dll

Sie auch benötigen eine FSharp.Core.optdata und FSharp.Core.sigdata, für Anleitung siehe unten einschließen, wenn tun dynamische Kompilierung und Ausführung gefunden .

Wenn Sie bauen die Anwendung das Ausgabeverzeichnis mit FSharp.Core.dll fehlen zwei Dateien:

FSharp.Core.optdata 
FSharp.Core.sigdata 

Sie müssen diese beiden Dateien und die richtigen Versionen der Dateien finden, die mit FSharp.Core zustimmen. dll und kopieren Sie sie in das Build-Ausgabeverzeichnis.

Wie die Dateien mit Visual Studio

Von Menü Ansicht finden -> Lösung Explorer
Projekt erweitern
Referenzen erweitern
Recht FSharp.Core und wählen Sie Eigenschaften.

enter image description here

der vollständige Pfad gibt das Verzeichnis, das mindestens die drei Dateien haben sollte. Verwenden Sie einen Datei-Explorer, um das Verzeichnis im vollständigen Pfad zu öffnen.

enter image description here

Kopieren Sie die beiden Dateien

FSharp.Core.optdata 
FSharp.Core.sigdata 

auf das Build-Verzeichnis.

Wie das Build-Verzeichnis mit Visual Studio

Von Menü Ansicht zu finden -> Lösung Explorer
Select Project
Drücken Sie F4, um die Eigenschaften Seite

enter image description here

das Projekt zu öffnen Ordner mit \bin\Debug ist der Standard beim Debuggen mit VS.

Standort ändern von fsi.exe

Jetzt haben Sie die beiden benötigten Dateien müssen Sie auch fsi.exe

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

die Position ändern, weil ich das fsi.exe zweifeln ist in der Wurzel Ihres C-Laufwerks.

+1

Danke. Das hat funktioniert. –

+0

Große Erklärung, aber ich habe immer noch den gleichen Fehler nach dem Kopieren der Dateien. – Wingjam

+0

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