USA .NET en VB6
[Usa un componente .NET en aplicaciones VB6]

Fecha: Diciembre 15 de 2004
Autor: Gabriel Flores
gabofr@yahoo.com

 


Objetivo

Crear un componente en .NET para ser utilizado en VB6

Problemática

¿Aún no estás convencido de migrar al cien por ciento tus aplicaciones de VB6 a .NET? Puedes empezar migrando al menos alguna de las librerías que tu aplicación usa para "tentar" las aguas y de ahí cotinuar el proceso de migración. En este artículo veremos como hacer una librería en .NET y ver qué debemos hacer para poder utilizar esa librería en nuestra aplicación de nuestro queridísimo VB6.

La librería .NET

La clase que haremos, para fines prácticos hace algo súmamente sencillo, regresar la fecha actual. Simplemente usando el Notepad o tu editor de textos favorito tenemos que crear esta clase:

C#

using System;
namespace FechaNET
{
    public interface IFecha
    {
        DateTime ObtenerFecha();
    }
    
    public class Fecha: IFecha
    {
        DateTime IFecha.ObtenerFecha()
        {
            return DateTime.Now;
        }
    }
}

VB.NET

Imports System

Namespace FechaNET

    Public Interface IFecha
        Function ObtenerFecha() As DateTime
    End Interface

    Public Class Fecha
        Implements IFecha

        Public Function ObtenerFecha() As Date Implements IFecha.ObtenerFecha
            ObtenerFecha = DateTime.Now
        End Function
    End Class

End Namespace

Debes notar que en la clase estamos implementando una interfaz, esto porque a la hora de usarlo en VB6 por parte de COM debemos crear el objeto con la especificación de la interfaz, como veremos más adelante. Grabamos nuestra clase como FechaNET.cs o FechaNET.vb según el caso.

Ajustando nuestra librería

Necesitamos ahora compilar nuestra librería a manera de .NET Module. Si usamos C# usamos el compilador de C# csc.exe y si usamos VB.NET usamos el compilador vbc.exe. Ejecutamos la línea de comando de Visual Studio y compilamos (tomando en cuenta que los archivos los guardaremos en una carpeta llamada FechaNET):

C#

    
C:\FechaNET>csc /target:module FechaNET.cs

VB.NET

    
C:\FechaNET>vbc /target:module FechaNET.vb

Necesitamos ahora generar las llaves para el strong name de nuestra librería. Esto para poder agregar el assembly al GAC (Global Assembly Cache) y evitarnos problemas en la localización de la librería al momento de usarlo en VB6. Para generar las llaves, utilizaremos la herramienta sn.exe (Strong Name) con el parámetro -k para que efectivamente las genere y con el nombre de archivo donde las guardaremos, en nuestro caso FechaNET.snk:

    
C:\FechaNET>sn -k FechaNET.snk

Ahora hay que ligar estas llaves recién generadas a nuestro .NET Module para generar el DLL que usaremos. Con la utilería Assembly Linker (AL.exe) podemos usar sus parámetros para hacerlo:

    
C:\FechaNET>al /out:FechaNET.dll FechaNET.netmodule /keyfile:FechaNET.snk

De este modo, ya podemos agregar el assembly al GAC, utilizando ahora la herramienta gacutil.exe e indicándole que deseamos instalar el assembly descrito en el DLL generado:

    
C:\FechaNET>gacitul /i FechaNET.dll

Con la utilería TLBExp.exe, exportamos la librería de tipos que usamos en nuestra clase, paso necesario para exponerla a COM y que nos generará un archivo nuevo llamado FechaNET.tlb:

    
C:\FechaNET>tlbexp FechaNET.dll

Por último, hacemos el registro del assembly para poder visualizarlo y explotarlo en nuestras aplicaciones mediante la utilería regasm.exe:

    
C:\FechaNET>regasm /tlb:FechaNET.tlb FechaNET.dll

En VB6

Con todo lo anterior ya tenemos listo todo para usar nuestra clase en Visual Basic 6. Iniciamos el IDE y si nos vamos a las referencias del Proyecto incluso podemos ver nuestra librería:

References en VB6

Simplemente para probar, en el manejador del evento Form_Load tecleamos el siguiente código de VB6:

Private Sub Form_Load()
    Dim objFecha As FechaNET.IFecha
    Set objFecha = New FechaNET.Fecha
    
    MsgBox objFecha.ObtenerFecha
End Sub

Notemos que estamos realmente declarando el objeto como instancia de la interfaz que diseñamos en .NET, y luego instanciamos el objeto ahora sí, como objeto de la clase implementada.

Al ejecutar el proyecto, tenemos que efectivamente, de nuestra clase .NET obtenemos la información de la propiedad Now de DateTime y la mostramos con un simple MessageBox:

MessageBox

Conclusión

Aquí vimos como es relativamente sencillo generar una clase en .NET con la funcionalidad tan compleja como queramos para poder aprovechar las características de .NET, aún cuando todavía es VB6 nuestra herramienta de desarrollo más usual. Este primer paso, es lo que nos puede garantizar una satisfactoria migración completa al desarrollo .NET.

Hacer todo esto desde el IDE de Visual Studio .NET es mucho más simple, pero siempre hay que ver que hay detrás de lo que hacemos para comprender mejor su funcionamiento. Además, las técnicas usadas aquí también nos pueden servir para nuestros desarrollos en otro lenguaje que soporte COM, como C++, Delphi, VB5, etc.

Recursos

El objetivo de este artículo fue crear rápidamente una clase en .NET para ser consumida con VB6, sin embargo, para quien quiera saber más, agrego los siguientes enlaces que exponen a mayor profundidad y detalle lo revisado aquí. Las técnicas son básicamente las mismas, aunque lo escrito aquí es un consenso de todos:

How Do I... Pass Simple Data from .NET Code to VB6 Code

Calling a .NET Component from a COM Component

Cómo usar un componente .NET desde COM

.NET Framework Tools


ir al índice

Fichero con el código de ejemplo: gflores_usanetenvb6.zip - 7 KB