2010-03-03 31 views
7

Quiero programar algo en C# y F #. Tengo clases parciales y me gustaría definir los métodos F # en algunos de ellos. Me sale el problema de que una clase parcial no puede ser distribuida en 2 DLL. ¿Hay alguna forma de fusionarlos? Prefiero una solución gratuita y la capacidad de hacerlo automáticamente en una compilación normal.¿Combinar varios archivos binarios .NET juntos?

Respuesta

5

Ya he recibido una solicitud como esta, por lo que parece que a más personas les gustaría hacer esto. Sin embargo, como ya se dijo, esto no es posible. Puede usar ILMerge para fusionar varios ensamblajes (con distintas clases), pero no es posible escribir diferentes partes de una clase en un idioma diferente. La única respuesta que puede obtener es que tendrá que estructurar su código de manera diferente. Hay varias opciones:

  • Declare una # módulo F con funciones que contian las partes que desea hacer en F #
  • Declarar tipos con miembros en F # y luego utilizar estas clases de C#
  • declarar una clase de base en C# (o F #) y crea una clase heredada que agrega el resto de la funcionalidad en el otro idioma.

En cualquier caso, tendrá que desacoplar la funcionalidad de alguna manera (que es un requisito técnico y creo que también ayudará a que su código sea más legible).

para demostrar por qué las clases parciales a través de múltiples asambleas no pueden trabajar:

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

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

En este ejemplo, C# no se puede compilar el código, ya que no sabe si existe FSharpMethod y cuál es su tipo. El compilador de F # tampoco puede compilar el código, porque no sabe cuál es el tipo de csharpField (y si existe).

Por supuesto, esto es solo un ejemplo de un problema técnico, pero habría muchos de ellos - fácilmente se pueden imaginar muchos otros problemas que surgirían si quisieran apoyar esto (y parece que los dos compiladores lo harían necesita estar al tanto de las partes internas de la otra parte).

+0

comentarios hechos en Henk Holterman tienen razones adicionales por las cuales esto no funcionará. –

6

No puede escribir partes diferentes de una clase en diferentes idiomas.

¿Qué estás tratando de hacer?

Puede exponer los métodos en una biblioteca F # separada y llamarlos desde la clase en C#.
Puede usar ILMerge para combinar los dos ensamblajes.

+0

Antes de invalidar esto, tenga en cuenta que ILMerge no ayudará en absoluto. – SLaks

+0

Tengo una clase BasicUser con conexiones de bases de datos y otras cosas buenas como useridFromName VerifiedUser (y admin). Me gustaría tener algunas funciones en F # que usan muchas de esas funciones (normalmente son parte de la clase parcial) y me gustaría ser métodos de escritura en F #, a menos que sea demasiado complicado para mí y lo haré en C# y perder poco tiempo de desarrollo. –

+0

¿No funciona con ildasm-> merge-> ilasm? – Vlad

Cuestiones relacionadas