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

Registrar para 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:

Nuevo Proyecto

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.

Biblioteca de clases

Biblioteca de clases

Os aparecerá algo así:

Clase

Clase

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

Información de ensamblado

Información de ensamblado

Y después activamos la casilla de verificación «Crear ensamblado visible a través de COM»:

Visible a través de COM

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

Registrar para interoperabilidad COM

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

Referencias

Referencias

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:

Biblioteca ya creada

Biblioteca ya creada

Buena señal… y Ahora la clase:

Clase

Clase

Ya sólo nos falta llamar al método y devolver el resultado. Sencillo pero:

¿No funciona?

¿No funciona?

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:

Funciona!

Funciona!

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.

The following two tabs change content below.
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 una respuesta