在Visual Studio 2012中,是否有一种方法可以在调试C#时使用F# REPL?

10

如果我在C#程序中设置了断点,我想使用F# REPL来检查我的代码。有没有任何可能实现这个功能?


在Visual Studio中查看即时窗口。它不是F# REPL,但非常有用。 - Steven Wexler
C#中的即时窗口很糟糕,因为你不能使用Lambda表达式。 - bradgonesurfing
是的,我同意那真的很令人沮丧。但我仍然发现自己经常使用它。 - Steven Wexler
2个回答

12

你应该能够使用F# REPL调试一个C#项目——我在调试F#库项目时使用它,但是C#应用程序/库也可以使用(我想)。

编译你的C#项目。在F#交互式中,使用#r指令引用C#程序集(参见ArthurFSharp的帖子)。在你的C#代码中的某个地方插入断点。

在Visual Studio中,转到工具-> 附加到进程。在进程列表中找到Fsi.exe并双击它;如果您在列表中看不到它,请确保已启动Fsi进程(只需单击F# Interactive窗口即可)。

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

重要提示:请记住,Windows在加载程序集时会锁定它,直到它被加载到一个进程中。这意味着只要FSI处于打开状态,你就无法重新编译你的C#应用程序!不过修复方法很简单——一旦你对你的C#应用程序进行了一些更改并希望重新编译并开始测试,只需右键单击F# Interactive窗口中的任何位置,然后在上下文菜单中单击“重置交互式会话”。进程将被杀死并重新启动,这样你就可以重新开始了。(如果你忘记重新启动FSI进程并尝试重新编译你的应用程序,编译时间会比正常情况长一些,然后你会收到一个错误消息告诉你编译器无法写入输出文件。)


1
一个更简单的附加调试器的方法是在 F# 脚本内调用 System.Diagnostics.Debugger.Launch()。 - Marc Sigrist

4

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

例如:

using System;

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

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

而在F#交互式环境中:

> #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 = ()

提示:需要先编译你的项目。


3
这个问题是关于在 C# 中插入断点,然后在 F# REPL 中查看它。这要困难得多——事实上需要进行一些重要的诡计。 - John Palmer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接