Una de las cosas más reseñadas de ASP.NET 2.0 es que es capaz de gestionar páginas ASPX creadas en diferentes lenguajes todas al mismo tiempo. Es decir, puedes tener una página o un control escritos en C# y mezclarlos con otros escritos en VB.NET o J# sin problema. Incluso puedes depurarlos todos juntos desde Visual Studio, saltando sin problemas de un lenguaje a otro.

Ahora bien, desde mi punto de vista esto no es demasiado interesante. Es raro que reutilices una página de una aplicación a otra y si escribes una aplicación completa desde cero normalmente lo haces en el mismo lenguaje. Hombre, pensando en equipos de desarrollo donde varios programadores contribuyen al mismo proyecto y trabajan en lenguajes distintos es muy interesante, pero vamos...

Normalmente lo que compartes entre aplicaciones son controles o bibliotecas de funciones, las cuales normalmente deberías compilar en sus propios ensamblados y listo. Ya no tendrías que mezclar lenguajes ahí.

Otra posibilidad es que tengas un módulo o una clase escritas en tu carpeta App_Code de una aplicación y quieras reutilizarlas en otra. Normalmente lo que tendrías que hacer es simplemente copiarlas a la carpeta App_Code de tu proyecto nuevo y ya estaría. El problema es que App_Code no permite mezclar código de varios lenguajes dentro de ella. Así, si copias un archivo .vb a una carpeta App_Code que ya contiene algún archivo .cs verás que al ejecutar la aplicación el compilador se queja y te dice que no puedes mezclar lenguajes en App_Code.

Entonces ¿se pueden o no se pueden mezclar lenguajes?

Pues la respuesta es que sí, pero no directamente.

Cuando el compilador de ASP.NET compila de forma automática el contenido de la carpeta App_Code lo que hace es generar una DLL única para todas las clases que allí estén y para ello usa el compilador del lenguaje en el que estén escritas. Si están en más de un lenguaje no sabe a qué compilador llamar y por eso se queja.

Para resolver este asunto podemos echar mano de un "truco" que consiste en indicar al compilador cómo queremos compilar nuestro código existente en App_Code. En la sección <compilation> de web-config se puede indicar cuántas DLL de código queremos obtener a partir de App_Code y cómo están éstas organizadas. Cada ensamblado generado se corresponderá con una carpeta dentro de App_Code y se llamará al compilador para dicha carpeta.

De este modo podemos guardar en una carpeta todo el código en VB, en otra carpeta el código en J# y dejar en el raíz las clases escritas en nuestro lenguaje principal (en mi caso C#). La estructura podría quedar así:

Está claro: cada lenguaje en su carpeta.

Sin embargo si ahora ejecutamos la aplicación veremos que se vuelve a producir un error. Sigue sin funcionar.

El problema es que todvía nos hace falta ajustar las carpetas de código en web.config, de la siguiente manera:

<compilation>
   <
codeSubDirectories>
      <
add directoryName="CSharp"/>
      <
add directoryName="JSharp"/>
   </
codeSubDirectories>
</
compilation>

Fíjate en que no se indica qué lenguaje se usa para compilar cada carpeta (eso lo determina automáticamente el compilador) sino que se va a generar un ensamblado por cada carpeta y por lo tanto se puede usar un compilador diferente para cada una de ellas. De ahí que se pueda mezclar el código.

Ahora si ejecutas la aplicación verás que todo funciona sin problemas y puedes depurar todos a la vez etc...

Un par de observaciones:

1.- Si te fijas en la imagen de arriba, la de las carpetas, verás que éstas tiene un aspecto "normal", es decir, son amarillentas y no tienen distintivo especial alguno. Tras haber añadido las líneas anteriores al web.config si te vuelves a fijar verás que su aspecto es el mismo que el de la carpeta App_Code ya que van a ser compilados:

2.- ¿Por qué funciona a mezcla de lenguajes en las páginas? Porque cada página en el nuevo modelo de compilación de ASP.NET 2.0 (que a mi no me acaba de convencer) se compila en su propio ensamblado de manera individual, de ahí que pueda estar cada una de ellas en su lenguaje. Lo que no se puede hacer es mezclar lenguajes en la misma página, claro.

💪🏻 ¿Este post te ha ayudado?, ¿has aprendido algo nuevo?
Pues NO te pido que me invites a un café... Te pido algo más fácil y mucho mejor

Escrito por un humano, no por una IA