Visual studio 如何从VS2010即时窗口调用F#函数

Visual studio 如何从VS2010即时窗口调用F#函数,visual-studio,debugging,visual-studio-2010,f#,Visual Studio,Debugging,Visual Studio 2010,F#,在调试F#应用程序时,我希望能够从VS2010即时窗口调用F#方法,但它似乎不起作用。问题似乎在于F#方法实际上是FSharpFunc对象。我尝试使用“Invoke”方法,但交互式窗口无法识别它。Visual Studio的F#integration不支持即时窗口(或监视)中的F#表达式,因此唯一的选择是编写与F#使用的编译表示相对应的C#代码。我尝试过这样做,但遇到了与您描述的相同的问题—Invoke方法似乎存在(在Reflector中),但Visual Studio不想直接调用它。我使用以下

在调试F#应用程序时,我希望能够从VS2010即时窗口调用F#方法,但它似乎不起作用。问题似乎在于F#方法实际上是FSharpFunc对象。我尝试使用“Invoke”方法,但交互式窗口无法识别它。

Visual Studio的F#integration不支持即时窗口(或监视)中的F#表达式,因此唯一的选择是编写与F#使用的编译表示相对应的C#代码。我尝试过这样做,但遇到了与您描述的相同的问题—
Invoke
方法似乎存在(在Reflector中),但Visual Studio不想直接调用它。我使用以下示例进行了尝试:

let foo f = 
  let n = f 1 2 // Breakpoint here
  n + 1
但是,还有其他方法可以调用该函数。在这种情况下,F#编译器生成的实际代码是对
InvokeFast
方法的调用。如果在“立即”窗口中键入以下内容,则它将起作用:

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

只有在添加对Microsoft.CSharp.dll的引用时(并在代码中的某个地方使用程序集中定义的某种类型,例如作为注释,以便加载它),此操作才有效。

好的,此操作有效!我尝试了静态InvokeFast,但没有意识到需要强制加载Microsoft.CSharp。使用dynamic非常聪明;)只是澄清一下,
InvokeFast
方法应该在没有
Microsoft.CSharp.dll
的情况下工作(尽管可能需要做一些事情,以便立即窗口加载
FSharp.Core.dll
)。C#library仅用于
动态
。几天前我在msconnect中提出了一个建议:这似乎只是一个带有单个参数的函数的问题。我能够使用与C相同的语法直接从即时窗口调用具有多个(curried)参数的函数#
((dynamic)f).Invoke(1, 2)