2010-07-23 5 views
6

Beim Debuggen einer F # -Anwendung möchte ich gerne eine F # -Methode vom VS2010-Sofortfenster aus aufrufen, aber es scheint nicht zu funktionieren. Das Problem scheint zu sein, dass F # -Methoden tatsächlich FSharpFunc-Objekte sind. Ich habe versucht, die "Invoke" -Methode zu verwenden, aber das interaktive Fenster erkennt sie nicht.Wie rufe ich eine F # -Funktion aus dem unmittelbaren Fenster von VS2010 auf

+0

Ich habe vor ein paar Tagen einen Vorschlag in MS Connect eingereicht: https://connect.microsoft.com/VisualStudio/feedback/details/574242/f-debugger-support –

+0

Dies scheint nur ein Problem, wenn Sie habe eine Funktion mit einem einzigen Argument. Ich bin in der Lage, eine Funktion mit mehreren (Curry) Argumente direkt aus dem unmittelbaren Fenster mit der gleichen Syntax wie C# –

Antwort

9

Die F # -Integration für Visual Studio unterstützt keine F # -Ausdrücke im unmittelbaren Fenster (oder Uhren). Daher besteht die einzige Option darin, C# -Code entsprechend der kompilierten Darstellung von F # zu schreiben. Ich habe versucht, das zu tun, und ich habe das gleiche Problem, das Sie beschrieben haben - die Invoke-Methode scheint dort zu sein (in Reflector), aber Visual Studio möchte sie nicht direkt aufrufen. Ich versuchte es mit dem folgenden Beispiel:

let foo f = 
    let n = f 1 2 // Breakpoint here 
    n + 1 

Es gibt jedoch andere Möglichkeiten, die Funktion aufzurufen. In diesem Fall ist der tatsächliche Code, der vom F # -Compiler generiert wird, ein Aufruf an die Methode InvokeFast. Wenn Sie die folgenden Funktionen dem sofortigen Fenster eingeben, funktioniert es:

Microsoft.FSharp.Core.FSharpFunc<int, int>.InvokeFast<int>(f, 1, 2) | 

Es scheint auch, dass Sie die üblichen Invoke Methode dynamic von C# 4.0 nennen kann (was beweist, dass das Verfahren tatsächlich gibt es!):

((dynamic)f).Invoke(1, 2) 

Dies funktioniert nur, wenn Sie einen Verweis auf Microsoft.CSharp.dll hinzufügen (und einen Typ verwenden, der in der Assembly irgendwo in Ihrem Code definiert ist - z. B. als Anmerkung -, damit er geladen wird).

+0

Ok, das hat funktioniert! Ich versuchte die statische InvokeFast, aber ich wusste nicht, dass ich die Last von Microsoft.CSharp erzwingen musste. Dynamisch ist ziemlich clever;) –

+0

Nur um zu verdeutlichen - der 'InvokeFast' Ansatz sollte ohne' Microsoft.CSharp.dll' funktionieren (obwohl vielleicht etwas getan werden muss, damit das unmittelbare Fenster 'FSharp.Core.dll' lädt). Die C# -Bibliothek wird nur für 'dynamic' benötigt. –

Verwandte Themen