2010-03-03 4 views
7

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

ответ

5

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

  • Объявите # модуль F с функциями, которые contian части, которые вы хотите сделать в 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 (и существует ли он).

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

+0

комментарии, сделанные в Henk Holterman, имеют дополнительные причины, по которым это не будет работать. – 2010-03-03 21:47:55

6

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

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

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

+0

Прежде чем приступать к этому, обратите внимание, что ILMerge не поможет вообще. – SLaks

+0

У меня есть класс BasicUser с подключениями к базе данных и другие замечательные вещи, такие как useridFromName VerifiedUser (и admin). Мне нужно несколько функций в F #, которые используют многие из этих функций (как правило, они являются частью частичного класса), и я хотел бы писать методы в F #, если это не слишком сложно для меня, что я буду делать на C# и теряют мало времени разработки. – 2010-03-03 21:09:39

+0

Не будет ли это работать с ildasm-> merge-> ilasm? – Vlad