我可以使用F#Interactive来编写脚本或交互式调试/测试我的C#GUI项目吗?

时间:2009-10-24 10:18:49

标签: c# debugging f#

我看过F#和DirectX的演示。

用户选择一部分F#代码并将其发送给F#interactive。 它之间,表单的线程正在工作:表单显示动态内容并响应点击。

我能否为现有的C#winforms项目得出  我可以创建一个引用它的F#项目  然后在F#interactive中启动F#项目  运行表单的任意方法

编辑:在正在运行的应用程序中调用btShowNextNumber_Click的步骤是什么?

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    int i = 0;

    private void btShowNextNumber_Click(object sender, EventArgs e)
    {
        ++i;
        label1.Text = i.ToString();
    }
}

5 个答案:

答案 0 :(得分:7)

不确定。在F#interactive中,您可以执行以下操作:

#r "MyDllName.dll"
open MyNamespace

// Call the constructor to get a new form, then show it
let form = Form1()
form.Show()

// Call whatever public method you want
form.MyMethodThatIWantToUse()    

答案 1 :(得分:5)

您还可以添加:

Debugger.Launch()

到脚本。这将打开一个对话框,询问使用哪个调试器。例如。您可以使用与用于执行脚本的实例相同的Visual Studio实例。

答案 2 :(得分:2)

答案 3 :(得分:2)

F#就像C#或VB那样的CLR语言。这意味着它可以引用CLR程序集(DLL和EXE),从它们导入公共类并调用公共方法和属性。如果类,方法或属性不公开,你仍然可以使用反射来访问它们,但很少有你真的应该这样做。

请注意,要使WinForm UI元素响应用户操作,您需要运行Windows消息循环(使用Application.Run)。在F#shell的情况下,它们似乎是在后台线程中运行它并使用Control.Invoke或其等价物(WindowsFormsSynchronizationContext)将操作发布到此线程。

要调用您在示例中显示的方法,您需要执行以下操作之一:

1)如果方法btShowNextNumber_Click是公开的:

form.Invoke(new Action(()=> form.btShowNextNumber_Click(form, EventArgs.Empty)));

SynchronizationContext.Current.Send(o => form.btShowNextNumber_Click(form, EventArgs.Empty));

2)如果方法btShowNextNumber_Click不公开,但按钮btShowNextNumber是:

form.Invoke(new Action(()=> form.btShowNextNumber.PerformClick());

SynchronizationContext.Current.Send(o => form.btShowNextNumber.PerformClick());

据我了解F#shell的工作方式,可以通过SynchronizationContext.Send透明地发布命令设置它,就像IronPython shell does一样。不能说现在究竟是如何运作的。需要检查

答案 4 :(得分:1)

您需要一个支持托管代码的调试器。使用哪种语言编写代码主机无关紧要。我一直在不同的容器中调试我的代码,如MS Office,IE,Windows资源管理器,Visual Studio和其他VB / C#应用程序。