Cómo eliminar la refencia al ensamblado Microsoft.VisualBasic.dll en
nuestros proyectos
Introducción
Tuve la oportunidad a principios de Octubre, de asistir a través del Grupo de
Usuarios de Madrid (MADNUG) al evento que el Guille
(Guille
Community Tour) realizó con motivo del tour que ha realizado por diferentes
ciudades de España.
En aquella sesión, el Guille comentaba que en un proyecto de Visual Basic con
.NET, era imposible eliminar la referencia al ensamblado
Microsoft.VisualBasic.dll (Visual Basic Runtime
Library) que el compilador agrega por compatibilidad hacia atrás. El Guille
comentó que aunque lo quitaras de las referencias del proyecto, el compilador
agregaba el "famoso" ensamblado porque sí, y por lo tanto aparecía siempre ahí.
Y que aunque lo tratáramos de eliminar, era imposible y había que esperar a ver
si con la próxima versión de Visual Studio .NET (Visual Studio .NET 2010) era
por fín posible eliminar esa referencia.
Esto es una verdad a medias, y en aquel momento, no quise levantar la voz
indicando mi discrepancia, ya que aunque recordaba que sí se podía eliminar esa
referencia, no recordaba con exactitud como, y no hay peor cosa que decir las
cosas a medias y confundir aún más al personal. Por eso, no quise comentar nada,
pero después de mirar algunas cosas, recordar otras y pelearme con el compilador
de Visual Basic, la respuesta es clara y contundente... recordaba bien y sí se
puede eliminar la referencia al ensamblado Microsoft.VisualBasic de nuestro
proyecto, aunque no de forma directa desde Visual Studio 2008.
¿Cómo?. Eso es justamente lo que voy a tratar en esta entrada, como eliminar
la refencia del ensamblado Microsoft.VisualBasic.dll en un proyecto, por
ejemplo, en una librería de clases.
¿Qué es
Microsoft.VisualBasic.dll?
Este ensamblado es el culpable de incluir compatibilidad hacia atrás con
Visual Basic antes de la llegada de .NET. De hecho, este ensamblado contiene
métodos y funciones como Left, Right, Trim,... etc., funciones y métodos que no
son propios de .NET y que son utilizados por Microsoft.VisualBasic.dll para
actuar de wrapper o envoltorio con las funciones propias de .NET que
hacen la misma acción. A mí me recuerda esto a una especie de boxing y unboxing
(que se entienda lo que digo por favor, que ya sé que no es lo mismo y si se
entiende literalmente mi afirmación, es una burrada).
En realidad, el proceso es realmente simple, y consiste en que al llamar a
una función de Microsoft.VisualBasic.dll, ésta llama internamente a su
equivalente en .NET. De esta manera, un programador que viene de Visual Basic en
versiones previas a .NET, no sufre un choque drástico de cambios respecto a .NET
y programa casi de la misma forma en la que lo hacía antes.
El problema, es que el programador de Visual Basic continuará "trabajando"
con esos vicios adquiridos.
¿Mi opinión al respecto?. Que me parece una mala práctica que desde siempre
critiqué, pero que está ahí incluida para dar esa cobertura que algunos
programadores de Visual Basic ¿necesitan? para dar ese paso a .NET. El
caso es que llevamos ya cerca de siete años utilizando esta librería, y a mí por
lo menos, me parece un paso atrás... pero es lo que hay... de momento.
¿Mi recomendación?. ¡No usarla!. En lo posible, tratar de obviarla. Una
ventaja de los desarrolladores de C# respecto a esto, es que para ellos, eso de
Microsoft.VisualBasic.dll no saben lo que es y ni siquiera saben de su
existencia (aquí les envidio y mucho).
De hecho, es probable (y lo lógico) que en un futuro próximo, Microsoft
decida eliminarla, por lo que nuestras aplicaciones de .NET que utilicen esta
librería tendrían algunos problemas a la hora de migrarla a una versión más
nueva de .NET que ya no usara esta librería. No os durmais, porque nunca se sabe
si van a hacer el cambio o cuando lo harán... yo desde luego, lo haría para la
próxima versión de .NET.
De no arreglar esto, el problema de todo esto como ya os he adelantado,
seguirá realizándose arrastrando esos vicios adquiridos de Visual Basic a
.NET.
Y si queremos analizar otro motivo del porqué no debemos usar esa librería,
es porque lo queráis o no, "engorda" de alguna manera nuestro
ensamblado, consume más recursos en el sistema (muchas veces innecesarios),
agrega muchísimas funciones de tipo compartido o Shared, y porque el rendimiento
de la aplicación se ve afectado.
Una instrucción declarada o utilizada a través de Microsoft.VisualBasic.dll,
es reconvertida por lo tanto a su correspondiente instrucción en .NET, por lo
que al final, estamos haciendo de alguna manera dos cosas para hacer una sola.
Es como abrir un boquete en la pared al lado de la puerta para entrar en la
casa, cuando en realidad ya tenemos esa puerta hecha.
My y
Microsoft.VisualBasic.dll
También entiendo que el uso de My es muy útil para
diferentes proyectos, pero si podemos evitar su uso, mejor que mejor... y ¿cómo
podemos eliminar My en nuestro proyecto?,... quitando
Microsoft.VisualBasic.dll... ya que mucha de la funcionalidad
contenida en My, está implementada por tipos definidos dentro
de Microsoft.VisualBasic.dll, así que por todo lo comentado
anteriormente y por el "famoso" My, lo ideal es poder
prescindir de la referencia a este ensamblado y eliminar de un plumazo a
My y al poco deseado Microsoft.VisualBasic,
algo que veremos como hacerlo a continuación.
Quitando la referencia a
Microsoft.VisualBasic.dll
Lo primero y más importante, es que para llevar a cabo esta tarea,
desgraciamente no podemos utilizar el entorno de desarrollo de Visual Studio
(por lo que he podido ver), por lo que para hacer esto, deberemos ir a la
tediosa línea de comandos del compilador de Visual Basic (vbc :: Visual
Basic Compiler).
En mi caso, estoy utilizando Visual Studio 2008.
Otra "mala" noticia es que la línea de comandos requiere que
escribamos más comandos de los estrictamente necesarios, y que agregemos toda y
cada una de la información necesaria al ensamblado indicándoselo así a
vbc.exe, que al fin y al cabo, es el programa al que llama
Visual Studio 2008.
En resumidas cuentas, que el ejemplo que voy a describir aquí funciona, pero
que dependiendo de la complejidad del proyecto, es posible que tengamos que
modificar algunos de los parámetros de la línea de comandos que indico en el
siguiente ejemplo.
Una vez dicho esto, nos ponemos manos a la obra.
Lo primero de todo es crear nuestro proyecto de Biblioteca de
Clases con Visual Basic como lenguaje
(obviamente).
El código de nuestro ejemplo es el siguiente:
NombreEspacio.ClaseEjemplo (ClaseEjemplo.vb):
Namespace NombreEspacio Public Class ClaseEjemplo Public Function Cuadrado(ByVal valor As Long) As Long Return valor ^ 2 End Function End Class ' ClaseEjemplo End Namespace ' NombreEspacio
|
Como podemos observar,
dentro del código le he indicado el nombre de espacio y la clase con una función
pública.
Una vez hecho esto,
accederemos a las propiedades del proyecto y en concreto a la solapa Aplicación,
y eliminaremos el contenido del Espacio de nombres de la raíz. Nuestro proyecto
quedará como se indica a continuación:
Con esta modificación, lo
que hacemos es que la clase tenga en consideración el nombre de espacio que le
hemos indicado a Namespace y omita el espacio de nombres de la raiz con el fin
de que no nos duplique el nombre de espacio. Esto nos resultará además muy útil
para la línea de comandos, ya que el compilador de Visual Studio 2008 también
lee el archivo vbproj que contiene información para crear
nuesto ensamblado, y que en nuestro caso omitiremos para dejar todo más
claro.
Una vez finalizada esta
acción, vamos a eliminar las referencias de nuestro proyecto que no queremos
utilizar, y entre ellas
Microsoft.VisualBasic.
Para eliminar las
referencias de nuestro proyecto, seleccionaremos la opción
Propiedades de nuestro proyecto y elegiremos la solapa
Referencias. Allí eliminaremos las referencias que deseamos
quitar al proyecto.
En nuestro caso, hemos
dejado únicamente la referencia a System.
En las referencias del
proyecto, observamos y verificamos que tenemos únicamente una referencia al
ensamblado System.
Cuando hayamos modificado
la configuración y las referencias del proyecto como se indicaban en las
imágenes anteriores, pasaremos a compilar el ensamblado en Visual Studio
2008.
Nuestro ensamblado
quedará tal y como se indica en la siguiente imagen (utilizando
Reflector):
Como podemos observar,
nuestro ensamblado contiene tres referencias, a la librería
Microsoft.VisualBasic, a mscorlib, y a
System.
Los namespaces de nuestro
ensamblado, son My, My.Resources y
NombreEspacio.
Dentro de
NombreEspacio encontramos la función pública
Cuadrado.
Nuestro ensamblado en
este caso, tendrá un tamaño de 10.752 bytes.
Ahora bien, ¿cómo
eliminar la referencia a Microsoft.VisualBasic?. Porque aunque
la hayamos eliminado en las referencias del proyecto, el compilador nos la sigue
incluyendo..., justo como indicaba el Guille en las ponencias... a ver si no va
a ser verdad eso de que se puede eliminar... veamos...
Para hacer esto, salvo
que se me escape algo, debemos acudir a la línea de comandos.
Hay una salvadora
instrucción que es /vbruntime-. Esta instrucción tiene por
cometido compilar sin el motor de tiempo de ejecución predeterminado de Visual
Basic.
Sin embargo, al indicar
este comando, debemos indicar el ensamblado o ensamblados que sí queremos
agregar, y que en nuestro caso es System.
Además de esto, en este
ejemplo no hemos incluido ningún recurso. El compilador en Visual Studio 2008 lo
añade siempre por defecto, aunque no tengamos nada incluido, y es algo que
podríamos evitar incluir para crear ensamblados más livianos aún.
También deberíamos tener
en cuenta otros aspectos, pero esta es una demostración básica que espero que
aporte algo de luz de como eliminar la referencia del ensamblado de
compatibilidad con Visual Basic. Si quieres ponerte una manta en la
cabeza y probar cosas nuevas, genial.
El caso es que desde la
línea de comandos, preferiblemente la línea de comandos de Visual Studio 2008, o
bien agregando en las variables del entorno de Windows (PATH)
la ruta del compilador, deberemos escribir la instrucción general en la raiz del
proyecto (donde se encuentra el código fuente):
vbc *.vb /r:System.dll /t:library
/vbruntime- /vbruntime:System.dll /doc+ /recurse:AssemblyInfo.vb
/out:ReferenceLibrary2.dll
Esta instrucción hace lo
siguiente:
vbc es el compilador de Visual Basic.
*.vb lee
los ficheros de extensión vb del directorio en el que estamos.
/r:System.dll
hace referencia a System.dll como metadato del archivo ensamblado para
compilarlo correctamente.
/t:library lo utilizamos para indicar al compilador
que estamos creando una librería de clases.
/vbruntime- lo utilizamos para
eliminar las refencias de Visual Basic al proyecto.
/vbruntime:System.dll lo
usamos para agregar la referencia a System.dll en el ensamblado.
/doc+ es
utilizado para generar el archivo XML de documentación XML asociado al
código.
/recurse:AssemblyInfo.vb lo utilizamos para buscar en los directorios
o subdirectorios, y allí seleccionamos el archivo AssemblyInfo.vb para que lo
compile en el ensamblado (versionado, nombre fuerte o strong name,
etc).
/out:ReferenceLibrary2.dll es el nombre de salida de nuestro
ensamblado.
Ejecutamos esta
instrucción con el compilador y miramos los resultados en Reflector.
Observando este segundo
ensamblado, lo primero que llama la atención es que su tamaño es ahora de 4.096
bytes, bastante menor que el ensamblado anterior.
Analizando el ensamblado
en Reflector, vemos que la referencia a Microsoft.VisualBasic
ha desaparecido (BIEN). También han desaparecido los recursos,
ya que en este ejemplo no era necesario incluirlos.
De esta forma, se
demuestra que sí es posible eliminar la referencia a
Microsoft.VisualBasic dentro de nuestros proyectos Visual
Basic, aunque para hacer esto tengamos que bucear un poco dentro de la línea de
comandos del compilador de Visual Basic.
Ahora bien, ¿como
automatizar de alguna manera esta tarea?. Pues construyendo una pequeña utilidad
que nos ahorre tiempo y evite errores.
Si alguien se atreve, se
agradecerá mucho.
Espero que esto aporte
algo de luz sobre el famoso ensamblado
Microsoft.VisualBasic.dll y el cómo eliminarlo de nuestros
proyectos.
Referencias