看到C#windows形成了来自F#的项目代码

我有一个C#Windows窗体项目,其中包含一些C#代码。

问题:我如何拥有一个F#文件,我可以编写F#代码,但仍然引用我在Form1.cs上的所有C#代码(包括GUI)。

我能成功地做到这一点:
– 创建C#Windows窗体项目
– 创建一个F#Library项目
– 从我的C#项目引用F#Library DLL
– 这样我可以从C#调用F#函数

但是我还是看不到来自F#的按钮和文本框
我理解那是因为它是一个库,它不能引用System.Windows.Forms

那么我该如何解决这个问题呢? 我不希望它是一个库或者这个或那个,我只是希望它是一个允许我编写F#代码的文件,同时能够引用我的C#表单和代码。

我想你可以说我想要一个F#文件,它也是一个“部分类Form1”,这样我就可以继续为同一个Project编写代码,但是使用F#代替。 我怎么做?

如果我正确理解了这个问题,你实际上是在询问如何构建应用程序,以便可以使用WinForms设计器(仅在C#/ VB中可用)来创建表单,同时在F#中编写应用程序逻辑。

首先,没有办法在一个项目中混合使用这两种语言,这意味着你不能写出像F#中的一个部分和C#中的其他部分那样的partial类(这在技术上几乎是不可能的)。 因此,唯一的选择是编写一个F#项目和一个C#项目,并引用另一个项目。 有两种方法可以做到这一点:

(根据你的回答和评论,我想你可能更喜欢第一个)

从F#应用程序引用C#库:一种选择是在C#中创建一个简单的WinForms库项目,以包含使用WinForms设计器创建的表单(可能还有其他控件等),而不是其他任何东西。 然后,您将从在F#中创建的应用程序引用此库,并在F#应用程序中实现所有用户交互。

如果确保将WinForms设计器创建的YourForm类以及添加到表单中的所有相关控件标记为public ,那么您可以引用该表单并从F#应用程序控制它。

  • 我在本书的一个示例中使用了这种方法,所以如果您正在寻找一个示例,您可以查看第14章的源代码 (查找“FSharpEffects”)

从C#应用程序引用F#库:以这种方式构建应用程序时,您需要创建一个F#库,它公开应用程序所需的所有基本function,然后从C#应用程序引用它。 C#应用程序将添加所有用户界面交互代码,它将调用F#库来执行实际工作。

在这种情况下,F#库对C#表单一无所知。 如果从F#库引用System.Windows.Forms ,则可能需要一些WinForms控件作为参数(例如,配置它们和加载数据),但它不会知道C#中声明的控件。

这种方法的一个可能的扩展是在F#库中声明一个接口,在C#应用程序中实现它,然后将一个实现传递回F#库。 该接口可能会暴露应用程序的一些重要属性(例如,允许访问所有重要的WinForms控件)。 一旦为F#库提供了接口的实现,F#库就可以使用它来操作应用程序。

(带接口的方法需要编写更多代码,可能不太灵活,但是如果你想用C#编写主应用程序并在那里声明表单,那么它可能是最好的选择)

您需要将对System.Windows.Forms.dll的引用添加到F#项目,并将Form1类及其成员的可见性设置为public

(库也可以引用System.Windows.Forms;这就是可重用的控件项目)

你还需要一些方法来调用F#代码; 您可能希望将F#项目设置为EXE(调用Application.Run )和C#项目到库中。