índice de Visual Studio 2005 y .NET Framework 2.0 Trucos .NET 2.0

Usar clases de VB y C# en una misma aplicación Web de Visual Studio 2005

Sin necesidad de compilar en una librería independiente

 
Publicado: 16/Mar/2006
Actualizado: 16/Mar/2006
Autor: Guillermo 'guille' Som
Pulsa para votar este artículo en Panorama Box


Introducción

En la versión 2.0 de ASP.NET (la que se incluye con Visual Studio 2005 y Visual Web Developer) el modo de crear o generar los ensamblados con el código compilado del sitio Web ha cambiado a como se hacía en las dos versiones anteriores.
No vamos a entrar en detalles, pero básicamente en las versiones anteriores a la 2.0 de ASP.NET se creaba una sola DLL con todo el código que teníamos en el proyecto Web. Al estar todo el código compilado en una sola DLL estábamos limitados a usar solo un lenguaje de programación en todo el proyecto, aunque podíamos usar otros lenguajes, estos debían estar compilados y alojados en un ensamblado DLL el cual podíamos añadir como referencia y usar las clases que incluyera.
Pero en la versión 2.0 de ASP.NET esto ha cambiado. Ahora ya no se genera una sola DLL con todo el código, incluso ya no hay necesidad de tener que generar todo el código y compilarlo, porque en esta versión podemos copiar el código fuente directamente en el sitio Web y cuando se vaya a usar, será el propio runtime de .NET el que lo compilará y usará esa DLL para ejecutar el código, porque al igual que ocurría en versiones anteriores, todo el código usado por ASP.NET siempre está compilado.

Usar formularios Web con cualquiera de los lenguajes de .NET en una misma aplicación Web

La ventaja que sacamos de la nueva forma que tiene ASP.NET 2.0 de manejar el código es que ahora podemos crear aplicaciones Web que utilicen código en cualquiera de los lenguajes de .NET que están "pensados" para usar en las aplicaciones Web, que son los dos principales: Visual Basic y C#, además de J#.

Esta posibilidad de mezclar código o páginas Web escritas en lenguajes diferentes la podemos utilizar de dos formas distintas:

Una sería usando o creando páginas Web en las que cada una de ellas puedan usar lenguajes diferentes. Por ejemplo, si creamos un nuevo proyecto o sitio Web, inicialmente nos pedirá que indiquemos el lenguaje a usar. Si por ejemplo indicamos Visual Basic, esto no quiere decir que el resto de formularios o código tengamos que escribirlo en ese lenguaje, sino que será el lenguaje que se usará para ese primer formulario Web (o página Web) que añadimos a este proyecto Web.

Suponiendo que hemos creado un nuevo proyecto Web, (en Visual Studio 2005 en realidad se llama ahora Sitio Web), y hemos indicado el lenguaje Visual Basic, el primer formulario Web (página .aspx) utilizará ese lenguaje, además de usarlo con código independiente, es decir, el código se incluirá en un fichero separado.

Si queremos añadir una nueva página ASPX al añadir un nuevo elemento podremos seleccionar el lenguaje que usaremos en esa página, además de poder indicarle si queremos poner el código en una página aparte. En la figura 1 vemos el cuadro de diálogo en el que añadimos una nueva página a nuestro sitio Web.

Figura 1. Añadir un nuevo formulario Web a nuestro proyecto
Figura 1. Añadir un nuevo formulario Web a nuestro proyecto

En este caso le decimos que el lenguaje a usar en esa página será C#.

Una vez añadida esta página, tendremos en nuestro proyecto (o sitio) dos páginas Web: Default.aspx que usa código de VB y Default2.aspx que usa código de C#.
Si añadimos una serie de controles y le damos funcionalidad a estas páginas, incluso podemos poner links que abra la otra página desde cualquiera de ellas, veremos que podemos usar las dos páginas en el mismo proyecto aunque cada una utilice un lenguaje de programación diferente.

Esta forma de funcionar la gestiona de forma automática el propio ASP.NET 2.0, es decir, no tenemos que hacer nada especial para que podamos usar formularios Web que utilicen lenguajes diferentes.

Incluso el código usado en esos formularios puede estar indistintamente en ficheros separados o dentro del propio formulario Web, eso no es problema.

 

Usar clases escritas en distintos lenguajes en una misma aplicación Web

El problema se nos presentará a la hora de crear clases "normales", es decir clases independientes de los formularios, al menos si esas clases las escribimos en lenguajes diferentes, ya que si solo usamos un lenguaje para las clases (que no son formularios ni controles), no habrá problemas.

Por ejemplo, si añadimos una clase al sitio Web, por ejemplo en C#, lo único que nos indicará el Visual Studio 2005 será que esa clase deberíamos incluirla en una carpeta especial llamada App_Code, tal como podemos ver en la figura 2, que por cierto tiene un error ortográfico, je, je.

Figura 2. Al añadir una clase al proyecto nos avisa de que la almacenemos en una carpeta especial
Figura 2. Al añadir una clase al proyecto nos avisa de que la almacenemos en una carpeta especial

 

Nota:
En la versión 2005 de Visual Studio, el IDE que se encarga de gestionar todo lo relacionado con los sitios Web, tanto en las versiones normales como en las Express Edition, es en realidad el Visual Web Developer 2005 (VWD para los amigos).
Por tanto, todo lo que aquí veamos será válido también para la versión gratuita de Visual Web Developer 2005 Express Edition.

 

Esa clase la podremos usar desde cualquiera de los formularios que tengamos en el proyecto, estén escritos con el lenguaje que sea, incluso aunque no sea en el mismo lenguaje de la clase.
Por ejemplo, si esa clase es de C#, para probarla, podríamos crear un método estático (compartido) para probarla desde los dos formularios que tenemos actualmente.

El código de esa clase podía ser el siguiente:

public class Class1
{
    public static string Saludo()
    {
        return "Hola desde una clase de C#";
    }
}

 

Y desde el formulario Web de Visual Basic lo podríamos usar de esta forma:

Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click
    LabelSaludo.Text = Class1.Saludo()
End Sub

 

Lo mismo desde el formulario de C#:

protected void Button2_Click(object sender, EventArgs e)
{
    LabelSaludo.Text = Class1.Saludo();
}

 

Todo esto lo haremos sin tener que hacer nada especial, y podemos añadir cuantas clases de C# queramos, y usarlas como siempre usaríamos esas clases, sin tener que preocuparnos si estamos o no en una aplicación Web.

El problema nos lo encontraremos si añadimos nuevas clases en Visual Basic (o en otro lenguaje diferente al de la clase que antes hayamos añadido).

Por ejemplo, si añadimos una nueva clase al proyecto que tenemos, y esa clase es de Visual Basic, se creará de forma normal, (después de mostrarnos el mismo mensaje que tenemos en la figura 2), si le decimos que sí, esa clase se añadirá también a la carpeta App_Code. Y aparentemente todo está bien, incluso escribimos el código que queremos que tenga, en este caso también crearemos un método compartido que devuelve una cadena, tal como vemos en el siguiente código:

Public Class Class2
    Public Shared Function Saludo() As String
        Return "Hola desde una clase de VB"
    End Function
End Class

Pero una vez que tenemos la clase añadida, veremos que tenemos un error en la llamada al método de la clase Class1 (la de C#), tal como podemos ver en la figura 3:

Figura 3. Error cuando tenemos clases de diferentes lenguajes en el sitio Web
Figura 3. Error cuando tenemos clases de diferentes lenguajes en el sitio Web

Como podemos ver en la figura 3, el error es de que la clase Class1 no existe, pero sabemos que si existe.

¿Por qué pasa esto?
Pues porque en la carpeta App_Code no podemos tener clases de varios lenguajes.

¿Por qué no podemos tener en la misma carpeta clases de varios lenguajes?
Porque cuando se compila la aplicación Web, el VWD crea una DLL para cada carpeta y en el caso de las páginas y controles Web, crea una DLL por cada uno de los lenguajes usados.

¿Cómo podemos solucionarlo?
La solución es crear, dentro de App_Code, una carpeta para alojar el código de cada uno de los lenguajes.
Bueno, en realidad, en la carpeta App_Code pondremos las clases de un lenguaje cualquiera, y crearemos dentro de App_Code una carpeta para el otro (u otros) lenguaje.
Haciendo esto, nuestro proyecto estaría estructurado como vemos en la figura 4:

Figura 4. Estructura de nuestro sitio Web
Figura 4. Estructura de nuestro sitio Web

Pero aún haciendo esto, seguiríamos teniendo el error de la figura 3.
Y la solución "final" no es crear esa carpeta "fuera" de App_Code.

La solución es indicarle al runtime de .NET de que en este sitio Web tenemos clases escritas en lenguajes diferentes, de esa forma podrá crear las DLL correspondientes y usarlas sin problemas.

Esa información se la tenemos que indicar en el fichero web.config, particularmente dentro del nodo compilation en el que crearemos uno llamado codeSubDirectories, y ahí indicaremos los distintos subdirectorios con clases de lenguajes diferentes.

Que en nuestro ejemplo sería de esta forma:

<compilation debug="false" strict="true" explicit="true">
   <codeSubDirectories>
      <add directoryName="vb" />
   </codeSubDirectories>
</compilation>

Una vez hecho esto, el error desaparecerá y podremos usar la otra clase, tal como vemos en este código:

Protected Sub Button3_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button3.Click
    LabelSaludo.Text = Class2.Saludo()
End Sub

Por supuesto, desde la página de C# también podemos usar el método Saludo de la clase Class2 escrita con VB2005:

protected void Button3_Click(object sender, EventArgs e)
{
    LabelSaludo.Text = Class2.Saludo();
}

 

 

Aclarar que el nombre del directorio puede ser cualquiera, es decir, no tiene porqué ser el mismo nombre que el del lenguaje de las clases que contiene, en este caso lo he hecho así por "comodidad", lo importante es que en el atributo directoryName asignemos el nombre correcto.

 

Y esto es todo. Como siempre, espero que te sea de utilidad y que así puedas aprovechar todas (o casi) las posibilidades que ahora nos da ASP.NET 2.0

 

Nos vemos.
Guillermo

 

El código de ejemplo:

En este ZIP tienes el sitio Web de ejemplo: aspnet2_usarVByCS.zip - 5.37 KB

(MD5 checksum: BDA42E9BD15412289AA344D4F5E6B312)

Para usar este código, lo descomprimes en un directorio cualquiera, internamente usará el nombre usarVByCS, lo abres desde el Visual Studio 2005 o desde el Visual Web Developer 2005 Express Edition y puedes comprobar que todo funciona como debe... o al menos en teoría debería ser así, je, je.

 


la Luna del Guille o... el Guille que está en la Luna... tanto monta...