видя C # windows формирует код проекта из F # - PullRequest
3 голосов
/ 09 апреля 2010

У меня открыт проект Windows Forms на C # с некоторым кодом C #.

Вопрос: Как мне получить файл F #, в который я могу написать код F #, но при этом ссылаться на весь код C #, который у меня есть на Form1.cs (включая графический интерфейс).

Я могу успешно сделать это:
- Создать проект C # Windows Forms
- Создать проект библиотеки F #
- Ссылка на библиотеку DLL F # из моего проекта C #
- Таким образом, я могу вызывать функции F # из C #

Но я все еще не вижу свои кнопки и текстовые поля из F #
Я понимаю, что это потому, что это библиотека, и она не может ссылаться на System.Windows.Forms

Так как мне это исправить? Я не хочу, чтобы это была библиотека или то или иное, я просто хочу, чтобы это был файл, который позволит мне писать код F #, при этом имея возможность ссылаться на мою форму C # и код. Я думаю, вы можете сказать, что я хочу файл F #, который также является «частичным классом Form1», чтобы я мог продолжить писать код для того же проекта, но вместо этого используя F #. Как мне это сделать?

Ответы [ 2 ]

8 голосов
/ 09 апреля 2010

Если я правильно понимаю вопрос, вы на самом деле спрашиваете, как структурировать свое приложение, чтобы вы могли использовать конструктор 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 # и объявить форму там, это, вероятно, лучший вариант)

0 голосов
/ 09 апреля 2010

Вам необходимо добавить ссылку на System.Windows.Forms.dll в проект F # и установить видимость класса Form1 и его членов на public.

(Библиотеки также могут ссылаться на System.Windows.Forms; это и есть проекты многоразового использования)

Вам также понадобится способ вызова кода F #; Возможно, вы захотите сделать проект F # EXE-файлом (который вызывает Application.Run), а проект C # - библиотекой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...