Utilizar biblioteca de clases .NET en Access. Segunda aproximación a la Interoperabilidad COM.

Clase COM Visual Studio

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:

Nuevo Proyecto

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:

Clase COM

Clase COM

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):

Crear Clase COM

Crear Clase COM

Y ahora seleccionamos Clase COM de los elementos comunes:

Añadir clase COM

Añadir clase COM

Vemos que por defecto se crea código en la clase:

Código por defecto en Clase COM

Código por defecto en Clase COM

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…

Propiedades de proyecto

Propiedades de proyecto

Y desde ahí vamos a la información de ensamblado:

Información de ensamblado

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:

Ensamblado visible a travé de COM

Ensamblado visible a travé 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:

Registrar para interoperabilidad COM

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:

Clase COM Visual Studio

Clase COM 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.

Métodos accesibles

Métodos accesibles

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:

Crear clase

Biblioteca

Y también el de la clase:

Crear clase

Crear clase

Hasta aquí, todo igual que en el primer artículo, pero ahora veremos que al llamar al método, algo cambia:

Llamar método

Llamar método

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:

Compatibilidad binaria

Compatibilidad binaria

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.

The following two tabs change content below.
Arkaitz Arteaga
Llevo más de 10 años programando, sobre todo en Visual Basic y con bases de datos Access. Para mí, VBA y Access siguen siendo herramientas muy potentes. He desarrollado varios proyectos con PHP y MySql. Si sumo las webs que he tenido, probablemente pasaría de 100. Ahora prefiero dedicar todo mi esfuerzo a este blog (aunque sigo manteniendo unas cuantas...). Trabajo en la administración pública (si, soy funcionario), pero he trabajado en pequeñas empresas e incluso en una "grande" de las telecomunicaciones. Ultimamente estoy bastante metido en abrirme nuevos horizontes con C# y .NET. Renovarse o morir!

Deja un comentario