如果我在C#程序中设置了断点,我想使用F# REPL来检查我的代码。有没有任何可能实现这个功能?
如果我在C#程序中设置了断点,我想使用F# REPL来检查我的代码。有没有任何可能实现这个功能?
你应该能够使用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进程并尝试重新编译你的应用程序,编译时间会比正常情况长一些,然后你会收到一个错误消息告诉你编译器无法写入输出文件。)
您需要使用#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 = ()
提示:需要先编译你的项目。