【问题标题】:seeing C# windows forms project code from F#从 F# 查看 C# windows 窗体项目代码
【发布时间】:2010-04-09 01:41:50
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 您是否已将 F# 中的 Form1、Button 或函数声明为 public ?

标签: c# f# winforms


【解决方案1】:

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

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

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

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

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

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

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

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

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

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

【讨论】:

  • 首先,我昨天刚买了你的书,我很喜欢。其次,感谢您和曼宁购买纸质版后免费提供的 pdf 副本。我还没有 .Net 4,所以我无法编译你的第 14 章。与此同时,你的回复足够清晰和详细,可以回答我的问题。不幸的是,类部分 C# 和部分 F# 几乎是不可能的。这就是公共语言基础设施应该给我们带来的好处。看到 C# 和 F# 都编译为相同的中间语言,我希望这不仅是可能的,而且是给定的。
  • @Pessimist,在这种情况下,我建议你更改用户名;)
  • @Benjol:谢谢你让我发笑 :) 我是一个悲观主义者,不是因为我期待更糟的情况(这是“街道”的定义,玻璃半空等,不是真正的哲学),而是因为我认为现在存在的东西是不好的。我想说这与我们刚刚发现的有关 C# 和 F# 的内容一致。 ;)
  • @Pessimist - 由于不能在多个 C# 项目之间共享部分类,我不知道为什么可以在 C# 和 F# 之间共享部分类项目。我同意 F# 项目有更好的 UI 故事(Silverlight,我在看着你)会很好,但我们不要在这里假设奇迹。
【解决方案2】:

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

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

首先,您还需要一些方法来调用 F# 代码;您可能希望将 F# 项目设为 EXE(调用 Application.Run)并将 C# 项目设为库。

【讨论】:

  • 好的,我通过添加引用 > .Net > System.Windows.Forms 添加了对该 dll 的引用。现在我可以在我的 F# 文件上执行此操作:打开 System.Windows.Forms 现在如何引用我的 Form1 函数和按钮等?
  • 您的 F# 代码需要 Form1 类的实例。你可能想继承它。
  • 我不想让 F# 代码成为可执行文件,然后 C# 成为库,因为整个项目已经在 C# 中。我真的只是想为现有项目及其控件和功能编写 F# 代码,这些都在 C# 中。
  • 是的,但是 C# 项目需要为 F# 代码提供一个实例。最简单的方法是将所有代码保留在 C# 中,但从 F# 调用它,提供继承的 Form1 实例。否则,你会有一个循环引用。
  • 我不是 OO 专家,但我看不出继承会有什么帮助。我不能将我的 F# 代码实现为 Form1 的部分类吗? Google 说 F# 不支持部分类,但我不知道这有多过时。
猜你喜欢
  • 1970-01-01
  • 2015-09-27
  • 2020-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-13
  • 2014-09-03
  • 1970-01-01
相关资源
最近更新 更多