【问题标题】:Is there a way in Visual Studio 2012 to use F# REPL when debugging c#Visual Studio 2012 中是否有办法在调试 c# 时使用 F# REPL
【发布时间】:2013-04-22 17:22:07
【问题描述】:

如果我在 c# 程序中有断点,我很想使用 F# REPL 来检查我的 代码。这有可能吗?

【问题讨论】:

  • 查看 Visual Studio 中的即时窗口。它不是 F# REPL,但非常有用。
  • c# 中的即时窗口很糟糕,因为你不能使用 lambdas
  • 是的,我同意这非常令人沮丧。但我仍然发现自己大量使用它。

标签: c# debugging visual-studio-2012 f# read-eval-print-loop


【解决方案1】:

您应该能够使用 F# REPL 调试 C# 项目——我在调试 F# 库项目时会这样做,但 C# 应用程序/库也可以工作(我认为)。

编译您的 C# 项目。在 F# 交互中,使用 #r 指令引用 C# 程序集(请参阅 ArthurFSharp 的帖子)。在 C# 代码的某处插入断点。

在 Visual Studio 中,转到 Tools -> Attach to Process。在进程列表中找到Fsi.exe,双击;如果您在那里看不到它,请确保 Fsi 进程已启动(只需在 F# 交互窗口内单击即可完成)。

在 F# Interactive 中,执行一些将到达您设置的断点的代码;调试器应该像你想要的那样在断点处停止执行。只要调试器没有在某个断点处停止,您还可以从 FSI 中执行其他代码,例如更改正在运行的 C# 应用程序中的设置。

重要提示:请记住,每当程序集加载到进程中时,Windows 都会锁定它。这意味着只要 FSI 处于打开状态,您就无法重新编译您的 C# 应用程序!修复很简单——一旦您对 C# 应用程序进行了一些更改并想要重新编译并再次开始测试,只需在 F# 交互窗口中右键单击,然后单击上下文菜单中的“重置交互会话”。该过程将被终止并重新启动,因此您可以重新开始。 (如果您忘记重新启动 FSI 进程并尝试重新编译您的应用程序,编译将花费比正常时间稍长的时间,然后您将收到一条错误消息,告诉您编译器无法写入输出文件。)

【讨论】:

  • 附加调试器的更简单方法是在 F# 脚本中调用 System.Diagnostics.Debugger.Launch()。
【解决方案2】:

您需要使用#I 指令包含项目的路径,然后您可以加载您的程序集并使用它。然后加载程序集(#r 指令),打开命名空间,然后可以调用方法(并检查结果)。

例如:

using System;

namespace ConsoleApplication1
{
    public class Program
    {
        static void Main(string[] args)
        {
            PrintMessage();
        }

        public static void PrintMessage()
        {
            Console.WriteLine("Hello World!");
        }
    }
}

在 F# Interactive 中:

> #I "full path to debug directory";;

--> Added 'full path to debug directory' to library include path

> #r "ConsoleApplication1.exe";;

--> Referenced 'full path to debug directory\ConsoleApplication1.exe'

> open ConsoleApplication1;;
> Program.PrintMessage();;
Hello World!
val it : unit = ()

ps : 需要先编译你的项目。

【讨论】:

  • 问题是关于在 C# 中插入断点,然后在 F# REPL 中看到它。这要困难得多——事实上,这需要一些很大的技巧。
猜你喜欢
  • 1970-01-01
  • 2013-06-02
  • 2013-06-23
  • 1970-01-01
  • 2013-09-08
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多