如果我在 ac# 程序中有断点,我很想使用 F# REPL 来检查我的代码。这有可能吗?
2 回答
您应该能够使用 F# REPL 调试 C# 项目——我在调试 F# 库项目时会这样做,但 C# 应用程序/库也可以工作(我认为)。
编译您的 C# 项目。在 F# 交互中,使用#r
指令引用 C# 程序集(请参阅 ArthurFSharp 的帖子)。在 C# 代码中的某处插入断点。
在 Visual Studio 中,转到Tools
-> Attach to Process
。在进程列表中找到Fsi.exe
并双击它;如果在那里看不到它,请确保 Fsi 进程已启动(只需在 F# Interactive 窗口内单击即可完成)。
在 F# Interactive 中,执行一些将到达您设置的断点的代码;调试器应该像你想要的那样在断点处停止执行。只要调试器没有在某个断点处停止,您还可以从 FSI 中执行其他代码,例如更改正在运行的 C# 应用程序中的设置。
重要提示:请记住,只要将程序集加载到进程中,Windows 就会锁定它。这意味着只要 FSI 处于打开状态,您就无法重新编译您的 C# 应用程序!修复很简单——一旦您对 C# 应用程序进行了一些更改并想要重新编译并再次开始测试,只需在 F# 交互窗口中右键单击,然后单击上下文菜单中的“重置交互会话”。该过程将被终止并重新启动,因此您可以重新开始。(如果您确实忘记重新启动 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:需要先编译你的项目。