在Visual Studio 2012中,调试c#时是否有办法使用f# REPL ?

本文关键字:REPL 是否 2012 Studio Visual 调试 | 更新日期: 2023-09-27 18:11:22

如果我在c#程序中有一个断点,我会喜欢使用f# REPL来检查我的断点代码。这有可能吗?

在Visual Studio 2012中,调试c#时是否有办法使用f# REPL ?

你应该能够用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# Interactive窗口中右键单击,然后单击上下文菜单中的"Reset Interactive Session"。该进程将被终止并重新启动,因此您可以重新开始。(如果您忘记重新启动FSI进程并尝试重新编译应用程序,那么编译将比正常情况花费更长的时间,然后您将得到一条错误消息,告诉您编译器无法写入输出文件。)

您需要使用#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:需要先编译你的项目。