USA .NET en VB6 Fecha: Diciembre 15 de 2004
|
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 NamespaceDebes 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.csVB.NET
C:\FechaNET>vbc /target:module FechaNET.vbNecesitamos 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.snkAhora 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.snkDe 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.dllCon 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.dllPor ú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.dllEn 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:
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 SubNotemos 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:
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
Fichero con el código de ejemplo: gflores_usanetenvb6.zip - 7 KB