c# - 从 F# 查看 C# Windows 窗体项目代码

标签 c# f# winforms

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

问题:我怎样才能拥有一个 F# 文件,我可以在其中编写 F# 代码,但仍然引用我在 Form1.cs(包括 GUI)上的所有 C# 代码。
< br/>

我可以成功做到这一点:
- 创建一个 C# Windows 窗体项目
- 创建一个 F# 库项目
- 从我的 C# 项目中引用 F# 库 DLL
- 这样我就可以从 C# 调用 F# 函数

但我仍然无法从 F# 中看到我的按钮和文本框
我知道那是因为它是一个库,它不能引用 System.Windows.Forms

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

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

最佳答案

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

首先,无法在单个项目中混合使用两种语言,这意味着您不能编写类似 partial 类的东西,一部分在 F# 中,另一部分在 C# 中(这在技术上几乎是不可能的)。因此,唯一的选择是编写一个 F# 项目和一个 C# 项目,并相互引用一个。有两种方法可以做到这一点:

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

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

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

  • 我在书中的一个示例中使用了这种方法,因此如果您要查找示例,可以查看 source code第 14 章(查找“FSharpEffects”)

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

在这种情况下,F# 库对 C# 窗体一无所知。如果您从 F# 库中引用 System.Windows.Forms,那么它可能会将一些 WinForms 控件作为参数(例如,配置它们和加载数据),但它不会知道关于在C#。

此方法的一个可能扩展是在 F# 库中声明一个接口(interface),在 C# 应用程序中实现它,然后将实现传递回 F# 库。该接口(interface)可能会公开应用程序的一些重要属性(例如,授予对所有重要 WinForms 控件的访问权限)。一旦您将接口(interface)的实现提供给 F# 库,F# 库就可以使用它来操作应用程序。

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

关于c# - 从 F# 查看 C# Windows 窗体项目代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2604589/

相关文章:

f# - 将 F# 列表设置为 null 以进行序列化

c# - 如何在运行时查找窗体中的所有控件

c# - 标签内容和进度条

c# - 将 MvvmCross 与 dot42 一起使用

用于 Web 应用程序的 C#

c# - 在我的存储库中使用 LINQ 的方法会出现空错误

c# - 如何将字符串解析为日期时间?

c# - 如何在 Mac (Mono) 上使用从 nuget 下载的包

f# - 如何避免此 F# 程序中的堆栈溢出(递归树搜索)?

c# - 防止在调整 Windows 窗体大小时重绘控件