Объединить несколько двоичных файлов.NET вместе?

Я хочу программировать что-то и в C# и в F#. У меня есть частичные классы, и я хотел бы определить методы F# в нескольких из них. Я получаю проблему, что частичный класс не может быть заполнен через 2 DLLs. Существует ли способ, которым я могу, объединил их? Я предпочитаю бесплатное решение и способность сделать это автоматически в нормальной сборке.

7
задан 3 March 2010 в 20:58
поделиться

2 ответа

Я уже слышал подобный запрос, так что похоже, что больше людей хотели бы сделать это. Однако, как уже было сказано, это невозможно. Вы можете использовать ILMerge для объединения нескольких сборок (с разными классами), но невозможно написать разные части класса на разных языках. Единственный ответ, который вы можете получить, - это то, что вам придется по-другому структурировать код. Есть несколько вариантов:

  • Объявить модуль на F# с функциями, которые содержат части, которые вы хотите сделать на F#
  • Объявить типы с членами на F# и затем использовать эти классы из C#
  • Объявить базовый класс на C# (или F#) и создать наследуемый класс, который добавит остальную функциональность на другом языке.

В любом случае, вам придется каким-то образом разделить функциональность (это техническое требование, и я считаю, что это также поможет сделать ваш код более читабельным).

Чтобы продемонстрировать, почему частичные классы в нескольких сборках не могут работать:

// C# part
partial class Foo { 
  private int csharpField;
  int Bar() { return FSharpMethod(); }
}

// F# part
type Foo =
  member x.FSharpMethod() = x.csharpField

В этом примере C# не может скомпилировать код, потому что не знает, существует ли FSharpMethod и каков его тип. Компилятор F# также не может скомпилировать код, поскольку не знает, каков тип csharpField (и существует ли он).

Конечно, это лишь пример одной технической проблемы, но их будет много - вы можете легко представить множество других проблем, которые возникнут, если вы захотите поддержать это (и кажется, что два компилятора должны будут знать о внутреннем устройстве друг друга).

5
ответ дан 6 December 2019 в 23:04
поделиться

Вы не можете писать разные части класса на разных языках.

Что вы пытаетесь сделать?

Вы можете предоставить методы в отдельной библиотеке F # и вызывать их из класса в C #.
Затем вы можете использовать ILMerge для объединения двух сборок.

6
ответ дан 6 December 2019 в 23:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: