Если я правильно понимаю вопрос, вы на самом деле спрашиваете, как структурировать свое приложение, чтобы вы могли использовать конструктор WinForms (который доступен только в C # / VB) для создания формы и в то же время написать приложение логика в F #.
Прежде всего, нет никакого способа смешать два языка в одном проекте, что означает, что вы не можете написать что-то вроде partial
класса с одной частью в F # и другой частью в C # (технически это почти невозможно). Таким образом, единственный вариант - написать проект F # и проект C # и ссылаться один на другой. Есть два способа сделать это:
(основываясь на вашем ответе и комментариях, я думаю, вы можете предпочесть первый)
Ссылка на библиотеку C # из приложения F #: Один из вариантов - создать простой проект библиотеки WinForms на C #, содержащий форму (и, возможно, другие элементы управления и т. Д.), Созданную с помощью дизайнера WinForms, и ничего более. Затем вы будете ссылаться на эту библиотеку из приложения, созданного в F #, и реализовывать все взаимодействие с пользователем в приложении F #.
Если вы отметите класс YourForm
, созданный дизайнером WinForms, а также все соответствующие элементы управления, добавленные в форму, как public
, то вы можете ссылаться на форму и управлять ею из своего приложения F #.
- Я использовал этот подход в одном примере из моей книги, поэтому, если вы ищете пример, вы можете посмотреть исходный код для главы 14 (ищите "FSharpEffects")
Ссылка на библиотеку F # из приложения C #: Когда вы структурируете свое приложение таким образом, вам нужно будет создать библиотеку F #, которая предоставляет все основные функциональные возможности, необходимые вашему приложению, и затем ссылаться на нее из Приложение C #. Приложение C # добавит весь код взаимодействия с пользовательским интерфейсом и вызовет библиотеку F # для предварительной работы.
В этом случае библиотека F # ничего не знает о форме C #. Если вы ссылаетесь на System.Windows.Forms из вашей библиотеки F #, то в качестве аргументов могут потребоваться некоторые элементы управления WinForms (например, для их настройки и загрузки данных), но он ничего не узнает об элементах управления, объявленных в C # .
Одним из возможных расширений этого подхода является объявление интерфейса в библиотеке F #, реализация его в приложении C # и последующая передача реализации обратно в библиотеку F #. Интерфейс может предоставлять некоторые важные свойства приложения (например, предоставлять доступ ко всем важным элементам управления WinForms). Как только вы дадите реализацию интерфейса для своей библиотеки F #, библиотека F # сможет использовать ее для манипулирования приложением.
(подход с интерфейсом требует написания большего количества кода и может быть менее гибким, но если вы хотите написать основное приложение на C # и объявить форму там, это, вероятно, лучший вариант)