Utilizar biblioteca de clases .NET en Access. Segunda aproximación a la Interoperabilidad COM.
En el primer artículo sobre Interoperabilidad COM vimos la forma de utilizar librerías de .NET creadas con C# en una aplicación Access. Como os comentaba, no era la forma más adecuada de hacerlo y a riesgo de resultar pesado, la que os voy a explicar hoy tampoco lo es, pero prefiero explicarla para que tengamos todas las cartas sobre la mesa y entender mejor lo que estamos haciendo.
En este segundo artículo vamos a utilizar la manera más sencilla (por lo menos la más corta) de crear este tipo de bibliotecas para utilizarlas en Access, creando desde Visual Studio una plantilla de Clase COM. Aunque no sea la mejor manera de hacerlo, es la más cómoda ya que Visual Studio hace el trabajo por nosotros. Además, nos añade algo que la primera aproximación no hacía, tanto Early-Binding como Intellisense en VBA. Según vaya avanzando el artículo veremos lo problemas de hacerlo de esta manera.
Vamos a empezar a explicar el método. Abrimos Visual Studio y creamos un nuevo proyecto:
Esta vez vamos a utilizar Visual Basic .NET ya que C# no permite el uso de la plantilla «Clase COM» que vamos a utilizar para crear nuestra biblioteca de clases, más concretamente no soporta el atributo ComClass (ya es mala suerte que después de decidir que voy a dar más importancia a C# que a Visual Basic, encontremos una de las pocas cosas que Visual Basic .NET hace y C# no…). Así que seleccionaremos Visual Basic en el menú izquierdo y Biblioteca de Clases en el derecho:
Podemos borrar la clase que nos crea por defecto, no la vamos a utilizar. Crearemos una plantilla que trae Visual Studio para crear directamente clases que se puedan utilizar desde clientes COM. Una vez eliminada, vamos a crear la plantilla. Para ello nos dirigimos al menú Proyecto y agregamos una clase (o un componente, como queramos):
Y ahora seleccionamos Clase COM de los elementos comunes:
Vemos que por defecto se crea código en la clase:
Lo primero que vemos son unas constantes con sus GUID. Como nos indica Visual Studio en los comentarios, sirven para registrar la clase para ser utilizada desde COM (muy importante ya que nos mantendrá la compatibilidad binaria como veremos más adelante). Además de esto, nos crea un constructor sin parámetros.
En el anterior artículo no expliqué que para utilizar una clase de COM, es necesario que exista un constructor sin parámetros. En ese artículo no creamos constructor, pero Visual Studio te lo crea directamente si no existe (sin parámetros por supuesto). Retomaremos estos conceptos en posteriores artículos, de momento nos vale con saber que se crean.
Con estos simples pasos ya tenemos preparado el proyecto para utilizarlo desde COM. Para asegurarnos, miraremos las propiedades del proyecto que modificamos manualmente en el artículo sobre la primera aproximación a interoperabilidad COM. Para ello vamos al menú Proyecto->Propiedades de…
Y desde ahí vamos a la información de ensamblado:
En la información de ensamblado vemos que está activada la casilla de Crear ensamblado visible a través de COM:
Volvemos a las propiedades del proyecto y ahora miramos en el apartado Compilar, donde también está activada la casilla Registrar para interoperabilidad COM:
Pues nada, simplemente creamos una función similar a la del primer artículo pero esta vez en Visual Basic:
Public Function EstarVivo(ByVal renovarse As Boolean) As Boolean Dim vivo As Boolean = False If renovarse = True Then vivo = True End If EstarVivo = vivo End Function
Luego tendremos esto en Visual Studio:
Generamos el proyecto desde el menú compilar, y en principio todo debería de estar correcto. Para ello abrimos MS Access, añadimos la biblioteca desde el menu Herramientas->Referencias (estará disponible directamente) y vamos a un módulo. Presionamos la tecla F2 para abrir el examinador de objetos. En el desplegable seleccionamos nuestra biblioteca de clases y si seleccionamos la clase que hemos creado en Visual Studio, veremos que tenemos el método EstarVivo accesible desde Access.
Probamos con una función sencilla:
Function probar(ByVal estadoRen As Boolean) As Boolean End Function
Y vamos probando. Primero creamos un objeto de la biblioteca DePalo. Vemos que Intellisense nos muestra el nombre de la biblioteca:
Y también el de la clase:
Hasta aquí, todo igual que en el primer artículo, pero ahora veremos que al llamar al método, algo cambia:
Todo parece correcto y además es mucho más sencillo que hacerlo manual. Incluso si cerramos Access, podemos modificar la clase en Visual Studio, volver a generar y al abrir Access de nuevo las modificaciones están totalmente accesibles. Vamos a probar duplicando la función EstarVivo y llamándola prueba2. Volvemos a generar la biblioteca, abrimos Access y tenemos el método disponible, con lo que en principio no hay problemas de compatibilidad:
Entonces, ¿cuál es el problema? Pues en los siguientes artículos entraremos más en profundidad, pero vemos que con este método, sólo se pueden utilizar métodos de las clases que hayamos creado y no métodos heredados de la clase Object (que es la clase base). Además, tendremos problemas para distribuir la aplicación, en otros equipos necesitaremos registrar la biblioteca con Regasm. No hemos hablado de momento de registrar bibliotecas ya que con estos 2 métodos, Visual Studio las registra para que VBA pueda encontrar el componente. Más adelante lo haremos de una forma más correcta.
Como veis, con este método solucionamos parte de los problemas del método anterior y además es rápido y sencillo. No tenemos problemas de compatibilidad binaria ni para crear eventos (que como veremos más adelante, esto nos traerá muchos problemas con los siguientes métodos). Pero todavía no hemos llegado a la manera correcta de hacerlo, tiempo al tiempo.
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