我有一个C#Windows窗体项目,其中包含一些C#代码.
问题:我如何拥有一个F#文件,我可以编写F#代码,但仍然引用我在Form1.cs上的所有C#代码(包括GUI).
我可以成功地做到这一点:
-创建一个C#Windows窗体项目
-创建一个F#库项目
-从我的C#项目中引用F#库DLL
-这样我可以从C#调用F#的功能
但我仍然无法看到来自F#的按钮和文本框
我理解那是因为它是一个库,它不能引用System.Windows.Forms
那么我该如何解决这个问题呢?我不希望它是一个库或这样或那样的,我只是希望它是一个文件,这将让我写F#代码,同时能够引用我的C#窗体和代码.
我想你可以说我想要一个F#文件也是一个"部分类Form1",这样我就可以继续为同一个Project编写代码,但是使用F#代替.我怎么做?
如果我正确理解了这个问题,你实际上是在询问如何构建你的应用程序,以便你可以使用WinForms设计器(仅在C#/ VB中可用)来创建表单,同时在F#中编写应用程序逻辑.
首先,没有办法在一个项目中混合使用这两种语言,这意味着你不能写一个像partial
F#中的一个部分和C#中的其他部分的东西(这在技术上几乎是不可能的).因此,唯一的选择是编写一个F#项目和一个C#项目,并引用另一个项目.有两种方法可以做到这一点:
(根据你的回答和评论,我想你可能更喜欢第一个)
从F#应用程序引用C#库:一种选择是在C#中创建一个简单的WinForms库项目,以包含使用WinForms设计器创建的表单(可能还有其他控件等),而不是其他任何东西.然后,您将从在F#中创建的应用程序引用此库,并在F#应用程序中实现所有用户交互.
如果确保将YourForm
WinForms设计器创建的类以及添加到表单中的所有相关控件标记为public
,则可以引用该表单并从F#应用程序控制它.
从C#应用程序引用F#库:以这种方式构建应用程序时,您需要创建一个F#库,它公开应用程序所需的所有基本功能,然后从C#应用程序引用它.C#应用程序将添加所有用户界面交互代码,它将调用F#库来执行实际工作.
在这种情况下,F#库对C#表单一无所知.如果从F#库引用System.Windows.Forms,则可能需要一些WinForms控件作为参数(例如,配置它们和加载数据),但它不会知道C#中声明的控件.
这种方法的一个可能的扩展是在F#库中声明一个接口,在C#应用程序中实现它,然后将一个实现传递回F#库.该接口可能会暴露应用程序的一些重要属性(例如,允许访问所有重要的WinForms控件).一旦为F#库提供了接口的实现,F#库就可以使用它来操作应用程序.
(带接口的方法需要编写更多代码,可能不太灵活,但如果你想用C#编写主应用程序并在那里声明表单,那么它可能是最好的选择)