【问题标题】:How do I invoke an F# function from the VS2010 immediate window如何从 VS2010 即时窗口调用 F# 函数
【发布时间】:2010-07-23 20:16:24
【问题描述】:

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

【问题讨论】:

标签: visual-studio debugging visual-studio-2010 f#


【解决方案1】:

Visual Studio 的 F# 集成不支持即时窗口(或监视)中的 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)  |

您还可以使用 C# 4.0 中的dynamic 调用通常的Invoke 方法(证明该方法确实存在!):

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

仅当您添加对 Microsoft.CSharp.dll 的引用时才有效(并在代码的某处使用在程序集中定义的某些类型 - 例如作为注释 - 以便加载)。

【讨论】:

  • 好的,成功了!我尝试了静态 InvokeFast,但我没有意识到我需要强制加载 Microsoft.CSharp。使用动态非常聪明;)
  • 澄清一下 - InvokeFast 方法应该在没有 Microsoft.CSharp.dll 的情况下工作(尽管可能需要做一些事情以便立即加载 FSharp.Core.dll)。只有 dynamic 需要 C# 库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-21
  • 1970-01-01
  • 2011-02-15
  • 2021-03-29
  • 1970-01-01
  • 1970-01-01
  • 2017-11-09
相关资源
最近更新 更多