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