2011-03-25 10 views
12

Esta es la pregunta se inspira en la pregunta: ¿In what areas does F# make "absolute no sense in using"?¿Por qué los proyectos de Visual Studio están restringidos a un único idioma?

En teoría, debería ser posible utilizar cualquier lenguaje .NET soportado en un solo proyecto. Dado que todo debe compilarse en código IL, debe vincularse en un solo ensamblaje.

Algunos beneficios incluirían la capacidad de usar, digamos F # para una clase, donde F # es más adecuado para implementar su función y C# para otra.

¿Hay alguna limitación técnica que tenga en cuenta que impida este tipo de configuración?

Respuesta

13

Un proyecto está restringido a un único idioma porque, bajo el paraguas, un proyecto no es mucho más que un script MSBuild que llama a uno de los compiladores de línea de comandos para producir un ensamblaje de los diversos archivos de código fuente "contenidos" en la carpeta del proyecto. Hay un compilador diferente para cada idioma (CSC.exe es, por ejemplo, el de C#), y lo que cada proyecto tiene que hacer para convertir su código fuente "contenido" en un ensamblado difiere con cada idioma.

Para permitir que se compilen varios idiomas en un solo ensamblaje, el proyecto básicamente debe producir un ensamblaje para cada idioma, luego IL-Merge. Esto es costoso, requiere automatización compleja y generación de código de proyecto, y en la mayoría de las circunstancias es una necesidad marginal, por lo que el equipo VS simplemente no lo compiló.

+14

Creo que producir ensamblador para cada idioma e IL-fusión no es realmente el problema. El problema es que tendría que lidiar con referencias circulares entre las dos partes del proyecto. Esto significa esencialmente que no puede compilar fácilmente ninguna de las dos partes (¿cuál fue primero, un huevo o un pollo?) –

+0

@Tomas - Muy buen punto. – KeithS

+1

@Tomas - Eso podría resolverse imponiendo el orden de los archivos, como hace F #. –

9

Mientras que los proyectos están restringidos a un único idioma, una solución no es ... y las soluciones pueden contener varios proyectos.

+0

PERO usando solo el IDE es imposible (creo) tener un solo .EXE de múltiples proyectos. – xanatos

+3

Uno de los proyectos sería el EXE, y otro sería un archivo DLL que se encuentra al lado y es llamado por el EXE. – KeithS

+3

O un proyecto puede producir un .netmodule y el otro proyecto puede consumir ese .netmodule en su ensamblado dando como resultado un solo .exe. – ildjarn

5

Por lo que vale, es posible tener proyectos ASP.NET que usen C# y VB.NET (o cualquier otra cosa, defina los compiladores en web.config), solo en archivos diferentes.

3

Todos los archivos de código son procesados ​​por un solo compilador. Es por eso que un proyecto solo puede contener un solo idioma.

La mezcla de idiomas puede no tener mucho sentido tampoco, ya que cada lenguaje genera su propia IL.

Por supuesto, esto no restringe a formar tener múltiples proyectos de diferentes langauges en la misma solución, ya que cada proyecto se compila de forma independiente

2

Considere el uso de ILMerge si se quiere mantener un único archivo .exe o .dll incorporado por una cantidad de compiladores diferentes.

7

Como han mencionado otros, un proyecto es una unidad independiente compilada por un único compilador.

He oído la pregunta sobre cómo incluir, p. un tipo F # en un proyecto de C# más grande con bastante frecuencia, así que agregaré algunos detalles desde el punto de vista específico de F #. Hay bastantes problemas técnicos que hacen que sea muy difícil de mezclar F # y C# en un proyecto:

  • C# compilador ve todas las clases, mientras que F # tipo de declaraciones son dependientes del orden. No estoy seguro de cómo se especificará qué tipos debería ver el código F # en qué punto.
  • El compilador de F # necesita saber cómo se usan las declaraciones para inferir los tipos. ¿También obtendría información de uso del compilador de C#?
  • Los dos compiladores utilizan diferentes representaciones de tipos. Al compilar, no hay información de System.Type, entonces, ¿cómo compartirían la información?(Ambos necesitarían acordar una interfaz común que les permita incluir información específica del idioma, y ​​la información también puede estar incompleta).

Creo que esto es suficiente para explicar que hacer esto no es solo una característica que se puede o no se puede hacer dependiendo de la programación. En realidad es un problema de investigación interesante.

2

Técnicamente, puede mezclar idiomas en un solo proyecto, si uno (o más) de esos idiomas son lenguajes de scripting. Ver How to use Microsoft.Scripting.Hosting? para más detalles.

Sé que esto no es de lo que estabas hablando, pero es un hecho un poco divertido si no lo sabías.

2

El archivo de proyecto no es más que una lista elevada de parámetros de línea de comandos para el compilador relevante. Un archivo con la extensión de .csproj contiene los parámetros para un compilador de C#, .vbproj para el compilador de VB.NET y más.

Sin embargo, puede crear dos o más proyectos en el mismo archivo de solución, uno para cada idioma y luego vincularlos en un archivo EXE usando ILMerge.

Cuestiones relacionadas