我看过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();
}
}
答案 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)
当然,但您必须遵守符合CLS的规则。 更多信息: http://www.devarticles.com/c/a/C-Sharp/Making-Your-Code-CLS-Compliant/ http://msdn.microsoft.com/en-us/library/730f1wy3.aspx
答案 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#应用程序。