Utilizar biblioteca de clases .NET en Access. Primera aproximación a la Interoperabilidad COM.
Como ya sabéis los que habéis leído el artículo sobre el nuevo rumbo que va a tomar el blog, a partir de ahora quiero ir poco a poco aprendiendo mientras escribo. Tengo un mundo nuevo de posibilidades frente a mí, pero como no quiero separarme mucho de la herramienta que me da de comer (MS Access), voy a empezar con una serie de artículos explicando cómo crear bibliotecas de clases con Visual Studio para utilizarlas luego desde Access con VBA (o desde cualquier cliente COM).
Es posible que muchos no tengáis licencia de Visual Studio, ni ganas de pagarla, pero os paso el enlace a la web de Visual Studio Express desde donde os podéis descargar la versión gratuita (con menos funcionalidades, pero nos puede valer).
Antes de empezar comentaros que hay varias formas de hacer que se puedan utilizar este tipo de librerías desde Visual Basic, hacerlo manual, añadiendo desde Visual Studio una plantilla de Clase COM, etc. Pretendo escribir una serie de artículos para intentar explicarlas todas, así que no os podéis quedar sólo con este.
Esta manera de crear una librería de clases .NET para utilizarla desde clientes COM (como Visual Basic 6.0 y VBA) no es la manera «más correcta», pero creo que como primera aproximación puede valer. Además, no introducimos demasiados conceptos nuevos que nos puedan liar (el lio lo dejo para más adelante).
Como sabéis me suele gustar explicar todo el proceso de aprendizaje en mis artículos y yo empecé por aquí, creando las librerías sin interfaces, ni plantillas, ni nada. Con todo esto no quiero decir que no vaya a funcionar, pero no es la manera óptima de hacerlo por varios motivos:
- Utiliza Late-Binding, es decir, no se comprueba que existan las propiedades o métodos hasta que ejecutamos, con los problemas que esto puede traer…
- No podemos utilizar Intellisense ni en Visual Basic ni en VBA.
- No aparecen los métodos en el examinador de objetos
- Compatibilidad binaria. No os preocupéis, hablaremos sobre esto en posteriores artículos
Así que estáis avisados, No es la manera óptima de hacerlo, si no os interesa mi proceso de aprendizaje, esperad al siguiente post sobre .NET e interoperabilidad COM. Pero si en cambio queréis profundizar un poco en todo este tema e ir aprendiendo conmigo, podéis seguir el artículo.
Después de el tostón, vamos al lío. Abrimos Visual Studio y creamos un nuevo proyecto:
En nuestro caso, vamos a utilizar C#, que como comenté en el artículo sobre .NET Framework, es el lenguaje que quiero empezar a utilizar, aprender y compartir mientras lo hago. Así que seleccionamos Plantilla de Visual C# en el menú izquierdo y después Biblioteca de Clases.
Os aparecerá algo así:
Así que después de renombrar la clase, empezamos a trabajar en ella. Para esta prueba voy a utilizar el código de ejemplo del artículo sobre mis intenciones de renovación. Algo bastante simbólico y que a la vez nos puede valer como ejemplo. Será una clase llamada Vida con un simple método, EstarVivo al que le pasamos un parámetro Booleano «renovarse» que si es cierto, el método nos devolverá True:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ProgramadorDePalo { public class Vida { public Boolean EstarVivo(Boolean renovarse) { Boolean vivo = false; if (renovarse == true) { vivo = true; } return vivo; } } }
Una vez creado, tenemos que modificar las propiedades del proyecto para la registrar la interoperabilidad COM. Para ello vamos al menú Proyecto->Propiedades del proyecto. En la sección «Aplicación» pulsamos sobre el botón «Información de ensamblado»:
Y después activamos la casilla de verificación «Crear ensamblado visible a través de COM»:
De vuelta en la pantalla anterior, nos dirigimos a la sección «Compilar» y activamos la casilla de verificación «Registrar para interoperabilidad COM»:
Si miramos la información de ensamblado, veremos que se nos ha creado lo siguiente (en AssemblyInfo.cs):
using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // La información general sobre un ensamblado se controla mediante el siguiente // conjunto de atributos. Cambie estos atributos para modificar la información // asociada con un ensamblado. [assembly: AssemblyTitle("ProgramadorDePalo")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("ProgramadorDePalo")] [assembly: AssemblyProduct("ProgramadorDePalo")] [assembly: AssemblyCopyright("Copyright © ProgramadorDePalo 2014")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Si establece ComVisible como false, los tipos de este ensamblado no estarán visibles // para los componentes COM. Si necesita obtener acceso a un tipo de este ensamblado desde // COM, establezca el atributo ComVisible como true en este tipo. [assembly: ComVisible(true)] // El siguiente GUID sirve como identificador de typelib si este proyecto se expone a COM [assembly: Guid("0c17d2f8-db38-4a52-9429-8aeb52e21980")] // La información de versión de un ensamblado consta de los cuatro valores siguientes: // // Versión principal // Versión secundaria // Número de compilación // Revisión // // Puede especificar todos los valores o establecer como predeterminados los números de compilación y de revisión // mediante el carácter '*', como se muestra a continuación: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")]
Es importante sobre todo esta linea:
[assembly: ComVisible(true)]
Que hace que los tipos ensamblados estén visibles de COM.
Para que funcione, tanto la clase como los métodos, las propiedades y los eventos tienen que ser públicos. En nuestro caso como ya los tenemos declarados como públicos, sólo nos queda Generar la biblioteca.
Ahora volvemos a nuestro querido Access y vamos a ver si todo está correcto. Abrimos un módulo de Visual Basic y vamos al menú Herramientas->Referencias. Pulsamos sobre el botón «Examinar y vamos a la ruta de nuestro proyecto, \Visual Studio 2013\Projects\ProgramadorDePalo\LibreriaDePrueba\bin\Debug (de la forma de registrar la bibliotecas hablaremos en otros artículos, pero de momento si no aparece en la lista de referencias, esta es la manera. En el equipo donde estemos desarrolando no tendremos problemas) y allí seleccionamos el archivo con la extensión .tlb. Nos debería quedar algo así:
Vamos ahora a probar nuestra recién creada librería y para ello vamos a crear una función llamada probar con el siguiente aspecto:
Function probar(ByVal estadoRen As Boolean) As Boolean End Function
Ahora intentamos crear un nuevo objeto de la biblioteca ProgramadorDePalo y de la clase vida:
Buena señal… y Ahora la clase:
Ya sólo nos falta llamar al método y devolver el resultado. Sencillo pero:
En principio parece que no funciona, es por lo que os comentaba antes del Late-Binding y de Intellisense, pero como es una primera aproximación, vamos a completarlo a mano y probar a compilar y ejecutar:
Function probar(ByVal estadoRen As Boolean) As Boolean Dim prueba As New ProgramadorDePalo.Vida probar = prueba.EstarVivo(True) End Function
Compila perfectamente y cuando ejecutamos, la función hace lo que tiene que hacer:
De momento lo vamos a dejar aquí, con una librería creada en Visual Studio, utilizando C#, llamada correctamente desde Access y funcionando perfectamente. En artículos posteriores explicaré la forma «correcta» de hacer todo esto.
Arkaitz Arteaga
Latest posts by Arkaitz Arteaga (see all)
- Access: Encriptar contraseñas con SHA-256 utilizando biblioteca de clases .NET con C# - 4 mayo, 2014
- Rendimiento de Access contra backend Access en servidor de archivos remoto. Cuarta parte. - 27 abril, 2014
- Rendimiento de Access contra backend Access en servidor de archivos remoto. Aclaración. - 21 abril, 2014
- Utilizar biblioteca de clases .NET en Access. Tercera aproximación a la Interoperabilidad COM - 14 abril, 2014
- Vincular tablas en Access con Visual Basic - 11 abril, 2014
- .NET | Aplicaciones | C# | FrontEnd | Interoperabilidad COM | Visual Basic | Visual Studio