Exportar (0) Imprimir
Expandir todo
Expandir Minimizar

Visual Basic Fusion: Prácticas recomendadas para el uso conjunto de Visual Basic 6 y Visual Basic .NET

Visual Studio 2005

Mayo de 2007

Publicado: 12 de Junio de 2007

Scott Swigart
Swigart Consulting LLC.

Este artículo se aplica a:
   Microsoft Visual Basic 6
   Microsoft Visual Basic 2005
   Microsoft Visual Studio 2005

Resumen:Una aplicación de Microsoft Visual Basic 6 puede tener acceso a las bibliotecas de clases de .NET pero, para hacerlo, debe atravesar una capa de interoperabilidad denominada contenedor que se puede llamar desde un cliente. Éste contiene la clase de .NET deseada y la expone para que aparezca como un objeto COM tradicional, que puede usarse desde cualquier entorno que admita objetos COM. Aprenda a crear estos contenedores.

Descargue el código de ejemplo de Visual Basic Fusion—Best Practices.msi de este artículo.

En esta página

Información general Información general
Descripción de los tiempos de ejecución de Visual Basic 6 y Visual Basic .NET Descripción de los tiempos de ejecución de Visual Basic 6 y Visual Basic .NET
Llamada al Framework Llamada al Framework
Creación de contenedores con Visual Basic .NET Creación de contenedores con Visual Basic .NET
Comparación de opciones Comparación de opciones
Uso del código de ejemplo Uso del código de ejemplo
Conclusión Conclusión

Información general

Muchas organizaciones que tienen una base considerable de código en Microsoft Visual Basic 6 buscan tomar la mejor decisión respecto a este código heredado. Existen fundamentalmente tres opciones a la hora de decidir qué hacer con las aplicaciones Visual Basic 6. Puede mantener la aplicación Visual Basic 6 tal como está, sin incorporar tecnologías nuevas en esta aplicación heredada. Puede migrar totalmente la aplicación Visual Basic 6 a Visual Basic .NET. O puede conservar el código de Visual Basic 6 e interoperar con Visual Basic .NET para agregar fácilmente cualquier funcionalidad de .NET Framework a la aplicación existente. Las prácticas recomendadas para esta última opción, conocida como Visual Basic Fusion, son la base de este artículo.

Descripción de los tiempos de ejecución de Visual Basic 6 y Visual Basic .NET

Las aplicaciones Visual Basic 6 son esencialmente aplicaciones COM. Cuando desea realizar ciertas operaciones desde Visual Basic 6, como tener acceso a una base de datos o generar una interfaz de usuario, se agrega una referencia al componente COM apropiado y, a continuación, se usa la funcionalidad incluida en éste. También otras aplicaciones exponen normalmente funcionalidades a través de componentes COM. Por ejemplo, una aplicación de Visual Basic 6 puede automatizar Microsoft Word o Excel porque esas aplicaciones exponen interfaces COM.

Las aplicaciones de Visual Basic .NET no están basadas en COM y, de forma predeterminada, no exponen interfaces COM. Las aplicaciones de Visual Basic .NET tienen acceso a la funcionalidad en bibliotecas de clases de .NET. Microsoft .NET Framework incluye miles de bibliotecas de clases que permiten que las aplicaciones de Visual Basic .NET se comuniquen con bases de datos y tengan acceso a Internet, al registro, al sistema de archivos, al registro de eventos y a información de sistema, entre otras. La cantidad disponible de funcionalidad en las bibliotecas de clases de .NET Framework (FCL) es considerablemente superior a la de Visual Basic 6.

Visual Basic 6 y Visual Basic .NET se basan en tecnologías incompatibles. Una aplicación de Microsoft Visual Basic 6 puede tener acceso a bibliotecas de clases de .NET pero, para hacerlo, debe atravesar una capa de interoperabilidad denominada contenedor que se puede llamar desde un cliente. Éste contiene la clase de .NET deseada y la expone para que aparezca como un objeto COM tradicional, que puede usarse desde cualquier entorno que admita objetos COM (Visual Basic 6, Visual Basic 5, ASP, VBA, VBScript, etc.).

Llamada al Framework

Como se muestra en el artículo Uso de la biblioteca de clases de .NET Framework desde Visual Basic 6, el primer paso de la llamada a .NET Framework es registrar la DLL necesaria de .NET Framework (denominada ensamblado) como un objeto COM. Esto se puede realizar con la utilidad de línea de comandos regasm disponible en el SDK de .NET Framework, que se instala como parte del producto Visual Basic Express. Si Visual Studio 2005 no está instalado, es muy recomendable descargar e instalar la versión gratuita de Visual Basic Express.

Tutorial 1. Registro de System.dll para que se pueda usar desde Visual Basic 6

  1. Navegue hasta Inicio | Ejecutar.

  2. En el diálogo Ejecutar, escriba CMD y haga clic en Aceptar.

  3. Escriba cd C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727.

  4. Escriba regasm system.dll.

Una vez se registra el ensamblado, puede agregar desde Visual Basic 6 una referencia al mismo, como si fuera cualquier otro objeto COM:

Figura 1. Agregar una referencia a system.dll desde Visual Basic 6

Nuevamente, Visual Basic 6 podrá llamar al ensamblado System.dll de .NET porque se creó para él un contenedor que se puede llamar mediante COM. Sin embargo, para que una clase de .NET y sus funciones aparezcan en el contenedor que se puede llamar mediante COM, la clase de .NET tiene que cumplir un conjunto de reglas bastante restrictivas. Como resultado, sólo se podrá llamar directamente desde Visual Basic 6 a un porcentaje muy reducido de las clases de System.dll. Una de las funciones que se puede llamar desde Visual Basic 6 es WebClient.DownloadFile.

Lista 1. Llamada a la función DownloadFile desde Visual Basic 6

Dim webDownload As System.WebClient
Set webDownload = New System.WebClient
webDownload.downloadFile _ 
    "http://www.ssec.wisc.edu/data/west/latest_westir.jpg", _
    App.Path & "\latest_westir.jpg"

Creación de contenedores con Visual Basic .NET

El ejemplo anterior no debe crear la falsa impresión de que basta con usar Regasm con cualquier ensamblado de .NET para que toda la funcionalidad .NET esté disponible en Visual Basic 6. En la mayoría de los casos, cuando desee llamar a .NET Framework, a componentes .NET de terceros o a bibliotecas .NET de código abierto, deberá escribir clases contenedoras para Visual Basic .NET. Esto se debe a que una clase de .NET debe cumplir reglas bastante estrictas para presentarse apropiadamente como un objeto COM y la mayoría de las clases de .NET no cumplen estas reglas.

Para tener acceso a la funcionalidad .NET, se crea una clase en Visual Basic .NET que cumple con reglas para interoperabilidad COM y esta clase llama al código .NET deseado en nombre de la aplicación Visual Basic 6.

Figura 2. Llamada a .NET Framework desde Visual Basic 6 a través de clases contenedoras de Visual Basic .NET

Una clase contenedora sencilla

Como ejemplo sencillo, considere la clase de .NET Framework Guid. Un GUID es un "identificador único global". Los GUID se usan en muchas situaciones de Windows para identificar de forma exclusiva objetos COM, archivos, usuarios y prácticamente cualquier otra cosa. Adoptan la forma de cadenas tales como: 13427d57-ccb5-42fd-91f7-b49d4c2ae9a3. Lo mejor de los GUID es que si genera correctamente uno, puede estar absolutamente seguro de que nadie más volverá a generar el mismo.

En Visual Basic 6, no existe una manera sencilla de generar un GUID, pero en Visual Basic .NET, sólo se necesita una línea de código:

Lista 2. Generación de un GUID en Visual Basic .NET

Dim g as Guid = Guid.NewGuid()

Desafortunadamente, la clase Guid no se creó de manera que se pueda llamar directamente desde Visual Basic 6. Para usar esta funcionalidad desde Visual Basic 6, es necesario crear una clase contenedora muy sencilla de Visual Basic .NET. Esta clase contenedora de Visual Basic .NET se expondrá como un objeto COM que se puede usar desde Visual Basic 6 y hará la llamada necesaria a la clase Guid de .NET Framework.

Los detalles sobre la creación de clases contenedoras se analizan en "Le interesan 5.000 clases", aunque los conceptos básicos se repiten aquí:

Tutorial 2. Creación del contenedor de Visual Basic .NET para la clase Guid

  1. Descargue y extraiga el código de ejemplo de este artículo.

  2. Copie el archivo ComClass.zip en C:\Documents and Settings\[nombre de usuario]\Mis documentos\Visual Studio 2005\Templates\ItemTemplates\Visual Basic.

    Si usa Visual Studio 2005, puede omitir el paso 2. Sin embargo, Visual Basic Express no incluye de forma predeterminada la plantilla de la Clase COM y esta plantilla es muy útil para exponer .NET Framework como objetos COM. Al copiar el archivo ComClass.zip en esta carpeta, la plantilla de la Clase COM estará disponible para Visual Basic Express.

  3. En Visual Basic Express, seleccione el comando de menú Archivo | Nuevo proyecto.

  4. En el diálogo Nuevo proyecto:

    a/ Seleccione la Biblioteca de clases de la Plantilla.

    b/ En el Nombre escriba NetFxWrapper. Éste pasa a ser el nombre del componente y aparece en la lista de referencias disponibles en Visual Basic 6.

    Figura 3. Creación del proyecto de contenedor en Visual Basic .NET

  5. Haga clic en Aceptar.

  6. En el Explorador de soluciones, elimine Class1.

  7. Seleccione el comando de menú Proyecto | Agregar nuevo elemento.

  8. En el diálogo Agregar nuevo elemento:

    a/ En Plantillas, seleccione Clase COM.

    b/ En el campo Nombre, escriba GuidWrapper.

    Figura 4. Creación de la clase COM contenedora de Visual Basic .NET

  9. Haga clic en Agregar.

  10. En la línea 20 (después de End Sub y antes de End Class) escriba:

    Lista 3. Función contenedora en Visual Basic .NET

        Public Function NewGuid() As String
            Dim g As Guid = Guid.NewGuid()
            Return g.ToString()
        End Function
    

    Esto crea una instancia de una clase Guid y la asigna a un valor de Guid recién generado. A continuación convierte el valor de Guid en una cadena y lo devuelve.

  11. Seleccione el comando de menú Generar | Generar NetFxWrapper. Esto compila el componente y lo registra como un objeto COM.

Ahora que ha creado el contenedor, puede llamarlo desde Visual Basic 6.

Tutorial 3. Uso del contenedor desde Visual Basic 6

  1. Inicie Microsoft Visual Basic 6.0.

  2. En el diálogo Nuevo proyecto, seleccione Exe estándar y haga clic en Abrir.

  3. Seleccione el comando de menú Proyecto | Referencias.

  4. Agregue una referencia a NetFxWrapper.

    Figura 5. Agregar una referencia a un objeto COM creado en Visual Basic .NET

  5. Agregue un CommandButton y un TextBox al formulario.

  6. Establezca la propiedad Título del CommandButton en Generar.

  7. En el evento clic de CommandButton, escriba:

    Lista 4. Llamada al contenedor desde Visual Basic 6

    Private Sub Command1_Click()
        Dim gw As NetFxWrapper.GuidWrapper
        Set gw = New NetFxWrapper.GuidWrapper
        
        Text1.Text = gw.NewGuid
    End Sub
    
  8. Ejecute la aplicación. Cada vez que hace clic en el botón, la aplicación Visual Basic 6 llama al contenedor de Visual Basic .NET y genera un nuevo GUID. El GUID se muestra en el TextBox.

    Figura 6. Visualización del GUID

Reglas para la creación de contenedores

La clase contenedora se necesita porque la clase Guid no cumple con las reglas para la interoperabilidad COM. Estas reglas, que la clase contenedora debe cumplir, son:

  1. El contenedor debe exponer un constructor predeterminado

    En Visual Basic 6, primero se crea una instancia de un objeto y, a continuación, se usan propiedades y métodos para inicializar el objeto. Por ejemplo:

    Lista 5. Inicialización de un objeto de conexión en Visual Basic 6

    Dim cn As ADODB.Connection
    Set cn = New ADODB.Connection
    cn.ConnectionString = _
        "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=mydb.mdb;" & _
        "User Id=admin;Password=;"
    

    Para configurar un objeto de conexión, primero debe crear una instancia del mismo y, a continuación, establecer propiedades tales como ConnectionString. En Visual Basic 6, la creación de un objeto y la inicialización de sus propiedades se deben hacer en pasos distintos.

    Sin embargo, en Visual Basic .NET, puede especificar la información de inicialización en el momento que crea una instancia del objeto. El código equivalente en Visual Basic .NET es:

    Lista 6. Argumentos que se pasan al constructor en Visual Basic .NET

    Dim cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=mydb.mdb;User Id=admin;Password=;")
    

    Puede observar que el objeto se crea e inicializa en una línea de código. Esto es posible porque los tipos .NET tienen un Sub New que se llama en el momento de crear el objeto y este Sub New puede aceptar argumentos. Una clase puede tener incluso múltiples métodos de constructor Sub New y cada uno aceptar diferentes tipos o números de argumentos.

    Lista 7. Constructores de clase de Visual Basic .NET

    Public Sub New()
    End Sub
    Public Sub New(ByVal connectionString As String)
    End Sub
    

    Cuando crea una instancia de una clase, el compilador de Visual Basic .NET averigua a qué Sub New llamar automáticamente. Si creó una instancia de OleDbConnection sin argumentos, llamaría al Sub New que no acepta argumentos. Si crea una instancia de OleDbConnection con un argumento de cadena de conexión, el compilador genera automáticamente una llamada al Sub New que acepta una cadena como argumento.

    Cuando Sub New no acepta argumentos se le denomina "constructor predeterminado", lo que significa que es el único llamado, de forma predeterminada, cuando no se suministran argumentos.

    Como Visual Basic 6 no puede pasar argumentos en el momento de crear la instancia de un objeto, una clase de .NET debe proporcionar un constructor predeterminado o no podrá usarla directamente desde Visual Basic 6. Una razón por la que muchas de las clases de .NET Framework no se pueden usar directamente es que todos sus métodos Sub New necesitan argumentos. Como no exponen un constructor predeterminado, no es posible crear una instancia de las mismas desde Visual Basic 6.

    Para estos objetos puede crear clases contenedoras. Su contenedor expone un constructor predeterminado, pero cuando crea una instancia de la clase de .NET Framework real, pasa los argumentos necesarios al Sub New de esa clase.

    Como ejemplo concreto, considere la clase FileInfo de .NET Framework. Esta clase le permitirá obtener muchas características de un archivo de disco. Sin embargo, no contiene un constructor predeterminado. El Sub New de FileInfo necesita la ruta de acceso al archivo deseado, pero se puede ajustar de la siguiente manera:

    Lista 8. Contenedor de Visual Basic .NET para FileInfo

    Private fi As FileInfo
    Public Sub New()
    End Sub
    Public Sub Initialize(ByVal filePath As String)
        fi = New FileInfo(filePath)
    End Sub
    

    Este contenedor contiene un Sub New que no acepta argumentos. Esto permitirá que esta clase se registre para interoperabilidad COM para que una aplicación de Visual Basic 6 pueda crear una instancia de la misma. La FileInfo interna no se crea hasta que la aplicación de Visual Basic 6 llame al método Inicialize. Desde Visual Basic 6 se usaría de la siguiente manera:

    Lista 9. Uso del contenedor de FileInfo desde Visual Basic 6

    Dim fi As NetFxWrapper.FileInfoWrapper
    Set fi = New NetFxWrapper.FileInfoWrapper
    fi.Initialize ("c:\somefile.txt")
    
  2. Muchos tipos de datos se deben convertir entre Visual Basic 6 y Visual Basic .NET.

    La mayor parte del trabajo de creación de un contenedor se reduce a convertir los tipos de datos de Visual Basic .NET a un formato con el que Visual Basic 6 pueda trabajar. Considere los dos métodos siguientes; uno devuelve una cadena y el otro devuelve un tipo de dato Guid:

    Lista 10. Función contenedora en Visual Basic .NET

        Public Function NewGuidAsString() As String
            Dim g As Guid = Guid.NewGuid()
            Return g.ToString()
        End Function
        Public Function NewGuidAsGuid () As Guid
            Dim g As Guid = Guid.NewGuid()
            Return g
        End Function
    

    En Visual Basic 6, la llamada a NewGuidAsString funcionará bien, porque las cadenas se pasan fácilmente entre Visual Basic 6 y Visual Basic .NET. Sin embargo, la llamada a NewGuidAsGuid desde Visual Basic 6 generará el siguiente error:

    Figura 7. Error generado al llamar a NewGuidAsGuid desde Visual Basic 6

    Esto se debe a que un objeto del tipo Guid no se puede pasar directamente a Visual Basic 6 desde Visual Basic .NET. Al crear contenedores para clases de .NET, dedicará la mayor parte del tiempo a convertir tipos de datos .NET en tipos que se puedan usar en Visual Basic 6.

    También puede usar el atributo MarshalAs de .NET para especificar qué tipo de Visual Basic 6 se debe usar para argumentos y valores devueltos. Por ejemplo, si una función de Visual Basic .NET devuelve un tipo de datos Decimal, esta función no se puede llamar desde Visual Basic 6. Sin embargo, puede especificar que el valor devuelto se debe convertir a un tipo Currency. Esto permitirá que Visual Basic 6 admita la función sin errores.

    Lista 11. Uso de MarshalAs para convertir tipos entre Visual Basic 6 y Visual Basic .NET:

    Public Function ReturnDecimal() As _
    <Runtime.InteropServices.MarshalAs(Runtime.InteropServices.UnmanagedType.Currency)> _
        Decimal
        Return 1.1
    End Function
    

    En la tabla siguiente se enumeran las conversiones automáticas entre tipos de Visual Basic .NET y Visual Basic 6:

    Tabla 1. Conversión de tipos de Visual Basic .NET a Visual Basic 6

    Tipo de Visual Basic .NET

    Tipo de Visual Basic 6

    Boolean

    Boolean

    Byte

    Byte

    Char

    No admitido, en su lugar devolver a Visual Basic 6 como string

    DateTime

    Date

    Decimal

    No admitido, en su lugar devolver como Single, Double o usar el atributo MarshalAs para devolver como Currency de Visual Basic 6.

    Double

    Double

    Guid

    No admitido, en su lugar devolver a Visual Basic 6 como string.

    Integer

    Long

    Long

    No admitido

    Object

    Object

    SByte

    No admitido en Visual Basic 6, en su lugar devolver como Integer.

    Short

    Integer

    Single

    Single

    String

    String

    TimeSpan

    No admitido, usar funciones como TotalSeconds o TotalMinutes y devolver como Double.

  3. Las funciones Shared no interoperan

    En Visual Basic 6, dispone de funciones globales que se pueden llamar desde cualquier parte de su código. Un problema con las funciones globales es que es difícil saber cuándo dos funciones globales diferentes están relacionadas lógicamente. En Visual Basic .NET, en su lugar puede agrupar funciones globales dentro de una clase. La ventaja es que puede llamar a la función con el nombre de la clase, sin necesidad de crear una instancia real de la clase:

    Lista 12. Función Shared

    If Not File.Exists(someFile) Then
        MessageBox.Show("File not found")
    End If
    

    En este ejemplo, la función Exists se llama inmediatamente después de la clase File. Para llamar a este método, el código no ha creado una instancia de la clase File; en su lugar, Exists se llama inmediatamente después del tipo File. Estas clases de funciones se denominan Shared (o Static) y se usan en todo .NET Framework

    Un problema con las funciones Shared es que no interoperan con Visual Basic 6. Para que Visual Basic 6 llame a una función, ésta debe ser realmente global o se debe llamar inmediatamente después de la instancia de una clase. Las funciones Shared tampoco interoperan.

    La solución es crear un contenedor a partir del cual pueda crear una instancia y, a continuación, usar el contenedor para llamar a la función Shared.

    Lista 13. Contenedor que llama a una función compartida

    Imports System.IO
    <ComClass(FileWrapper.ClassId, FileWrapper.InterfaceId, FileWrapper.EventsId)> _
    Public Class FileWrapper
        Public Const ClassId As String = "1596574F-9EE1-4439-854B-DF503099CEAE"
        Public Const InterfaceId As String = "02F98DBC-9298-4E9D-A991-
    E618C1B1BC53"
        Public Const EventsId As String = "2286FD23-B22D-4D49-B2CE-F3CFEC5C1CA5"
        Public Sub New()
            MyBase.New()
        End Sub
        Public Function Exists(ByVal fileName As String) As Boolean
            Return File.Exists(fileName)
        End Function
    End Class
    

    La clase FileWrapper se puede crear desde Visual Basic 6 porque expone un constructor predeterminado. Al llamar a la función Exists, ésta llama a la función compartida .NET File.Exists y devuelve los resultados. Visual Basic 6 llama a un método de la instancia de FileWrapper y FileWrapper llama a un método compartido de la clase File de .NET Framework.

    Desde Visual Basic 6, se puede usar de la siguiente manera:

    Lista 14. Uso de File.Exists desde Visual Basic 6

    Private Sub Command5_Click()
        Dim fw As New NetFxWrapper.FileWrapper
        Label2 = fw.Exists("c:\platform.ini")
    End Sub
    
  4. Los contenedores no deben usar funciones sobrecargadas

    .NET Framework le permite tener múltiples funciones exactamente con el mismo nombre, pero con argumentos diferentes. Considere lo siguiente:

    Lista 15. Funciones sobrecargadas en Visual Basic .NET

    Public Sub Save(ByVal fileName As String)
        _image.Save(fileName)
    End Sub
    Public Sub Save(ByVal fileName As String, 
        ByVal format As ImageFormatWrapper)
        Dim imageFormat As Imaging.ImageFormat
        Select Case format
            Case ImageFormatWrapper.Bmp
                imageFormat = Imaging.ImageFormat.Bmp
            Case ImageFormatWrapper.Emf
                imageFormat = Imaging.ImageFormat.Emf
            Case ImageFormatWrapper.Exif
                imageFormat = Imaging.ImageFormat.Exif
            Case ImageFormatWrapper.Gif
                imageFormat = Imaging.ImageFormat.Gif
            Case ImageFormatWrapper.Icon
                imageFormat = Imaging.ImageFormat.Icon
            Case ImageFormatWrapper.MemoryBmp
                imageFormat = Imaging.ImageFormat.MemoryBmp
            Case ImageFormatWrapper.Png
                imageFormat = Imaging.ImageFormat.Png
            Case ImageFormatWrapper.Tiff
                imageFormat = Imaging.ImageFormat.Tiff
            Case ImageFormatWrapper.Wmf
                imageFormat = Imaging.ImageFormat.Wmf
        End Select
        _image.Save(fileName, imageFormat)
    End Sub
    

    Una función toma un nombre de archivo como argumento y la otra toma un argumento adicional de formato de imagen. Ambas funciones se llaman Save. Cuando estas funciones se llaman desde Visual Basic .NET, el compilador puede determinar a cuál llamar según los argumentos pasados. Si sólo se pasa un argumento, entonces se llama a la primera función. Si se pasan dos argumentos, entonces se llama a la segunda función.

    COM no admite funciones sobrecargadas, de manera que si esta clase se expone a través de interoperabilidad COM, el contenedor COM debe generar nombres únicos para estas funciones. En Visual Basic 6, aparecen de la siguiente manera:

    Figura 8. Llamada a funciones sobrecargadas desde Visual Basic 6

    Observe que a las funciones Save se les asignan los nombres Save y Save_2. Esto le permite identificar a cuál desea llamar desde Visual Basic 6, aunque los nombres no son descriptivos. Sería preferible no usar sobrecargas en su contenedor y en su lugar suministrar un nombre único a cada función:

    Lista 16. Nombres únicos para funciones

    Public Sub Save(ByVal fileName As String)
        _image.Save(fileName)
    End Sub
    Public Sub SaveWithImageFormat(ByVal fileName As String, _
        ByVal format As ImageFormatWrapper)
        Dim imageFormat As Imaging.ImageFormat
        Select Case format
            Case ImageFormatWrapper.Bmp
                imageFormat = Imaging.ImageFormat.Bmp
            Case ImageFormatWrapper.Emf
                imageFormat = Imaging.ImageFormat.Emf
            Case ImageFormatWrapper.Exif
                imageFormat = Imaging.ImageFormat.Exif
            Case ImageFormatWrapper.Gif
                imageFormat = Imaging.ImageFormat.Gif
            Case ImageFormatWrapper.Icon
                imageFormat = Imaging.ImageFormat.Icon
            Case ImageFormatWrapper.MemoryBmp
                imageFormat = Imaging.ImageFormat.MemoryBmp
            Case ImageFormatWrapper.Png
                imageFormat = Imaging.ImageFormat.Png
            Case ImageFormatWrapper.Tiff
                imageFormat = Imaging.ImageFormat.Tiff
            Case ImageFormatWrapper.Wmf
                imageFormat = Imaging.ImageFormat.Wmf
        End Select
        _image.Save(fileName, imageFormat)
    End Sub
    

    Ahora cada función tiene un nombre único y su uso desde Visual Basic 6 es más sencillo.

    Figura 9. Funciones con nombres únicos

  5. Los contenedores se deben colocar en la memoria caché de ensamblados global

    Al registrar un objeto COM, el registro de sistema contiene la ruta del archivo DLL del objeto COM. De este modo, cuando su programa crea una instancia del objeto COM, el sistema operativo puede encontrar esa DLL y cargarla en memoria.

    Las ensamblados .NET funcionan de manera diferente. .NET Framework espera que el ensamblado se encuentre en la misma ubicación que el archivo ejecutable que lo usa o en una ubicación llamada la memoria caché de ensamblados global (GAC). Para garantizar que sus clases contenedoras .NET siempre se puedan encontrar en el tiempo de ejecución, se deben colocar en el GAC.

    Poner un ensamblado en el GAC es un proceso de dos pasos. Primero, se debe firmar el ensamblado. Esto se puede realizar de la siguiente manera:

    a/ En el Explorador de soluciones, haga doble clic en Mi Proyecto. Esto abrirá las páginas de propiedades de proyecto.

    b / En el Explorador de soluciones, haga doble clic en Mi Proyecto. Esto abrirá las páginas de propiedades de proyecto.

    c/ Haga clic en la ficha Firma.

    d / Haga clic en la casilla de verificación Firmar el ensamblado.

    e / En el desplegable Seleccione un archivo de clave de nombre seguro, haga clic en <Nuevo...>.

    f / En Nombre de archivo de la clave, escriba MyKeyFile.

    g / Desactive la casilla de verificación Proteger mi archivo de clave con una contraseña.

    h / Haga clic en Aceptar.

    i / Seleccione el comando de menú Generar | Generar NetFxWrapper.
    Esto agrega al proyecto un archivo de clave y cada vez que el proyecto se compile, el DLL resultante se firmará con esta clave. Los ensamblados se deben firmar antes de que se puedan colocar en la memoria caché de ensamblados global

    j / Navegue hasta Inicio | Ejecutar.

    k / Escriba cmd y haga clic en Aceptar para abrir una ventana de comandos

    l / En la ventana de comandos, cambie al directorio en que se compila la clase contenedora. En mi equipo, es: C:\Documents and Settings\Administrator\Mis documentos\Visual Studio 2005\Projects\NetFxWrapper\NetFxWrapper\bin\Release.

    m/ Escriba "C:\Archivos de programa\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil" -i NetFxWrapper.dll.

    Nota

    Preste especial atención a las comillas en la ruta de acceso a gacutil. Debe obtener un mensaje que dice que el ensamblado se agregó correctamente a la memoria caché de ensamblados global.

    Al implementar una aplicación de Visual Basic 6 que usa una clase contenedora, su instalador de la aplicación necesitará usar gacutil para instalar la clase contenedora en el GAC.

Comparación de opciones

Aunque este artículo se ha centrado en recomendaciones cuando se usa el enfoque de Visual Basic Fusion, vale la pena detenerse un momento a examinar todas las opciones para trabajar con aplicaciones de Visual Basic 6 y determinar si Visual Basic Fusion, o alguna otra táctica, es la mejor opción para una aplicación de Visual Basic 6 en particular.

Las opciones incluyen mantener una aplicación de Visual Basic 6 tal como está, migrar la aplicación completa a .NET o usar la técnica de Visual Basic Fusion. Cada una de ellas es la solución apropiada para una situación determinada.

Mantener tal como está

En esta opción, elige simplemente mantener una aplicación escrita en Visual Basic 6 como Visual Basic 6 y no usa .NET Framework en absoluto.

Ventajas:

Es sencillo: La aplicación fue escrita en Visual Basic 6 (o migrada a Visual Basic 6), de modo que mantener aquí la aplicación es la opción más sencilla. Es probable que sus desarrolladores ya conozcan este lenguaje y entorno de desarrollo y puedan efectuar en la aplicación muchos cambios o correcciones de errores con rapidez.

Desventajas:

Adición de nueva funcionalidad: Visual Studio 6,0 se lanzó en 1998. Visual Basic 6 se ha mejorado desde entonces, con excepción de los Service Pack. Sin embargo, la funcionalidad que se espera de las aplicaciones actuales ha cambiado. Con frecuencia se espera de las aplicaciones que se actualicen automáticamente cuando hay una versión nueva disponible, que trabajen sin conexión, que copien localmente en la memoria caché los datos, que incorporen funcionalidades de Internet, que tengan posibilidad de comunicarse con servicios web, entre otras. Aunque en la actualidad existe la tecnología para realizar estas tareas con sencillez, esta tecnología no está disponible en Visual Basic 6, de modo que realizar estas clases de mejoras únicamente con Visual Basic 6 puede requerir un trabajo muy intenso. El resultado es que muchas aplicaciones de Visual Basic 6 simplemente no se mejorarán para incluir este tipo de nueva funcionalidad, porque es demasiado costoso y difícil de lograr únicamente con Visual Basic 6.

Punto de fuga: Desde la introducción de Visual Basic .NET en 2002, se produjo una migración de desarrolladores de Visual Basic 6 a Visual Basic .NET. Como resultado, la gran mayoría de la información nueva de Visual Basic (libros, artículos, publicaciones en blogs, publicaciones en grupos de noticias, etc.) ha sido sobre Visual Basic .NET. Al mismo tiempo, disminuye la cantidad de información disponible sobre Visual Basic 6. Además, muchos desarrolladores creen que realizar la transición a Visual Basic .NET los ubica en una carrera más sólida, porque las mejoras y actualizaciones a este lenguaje continuarán. Esto no pretende insinuar que en el momento de escribir este artículo, sea difícil encontrar ayuda técnica en línea para problemas de Visual Basic 6 ni que sea difícil contratar un desarrollador de Visual Basic 6, pero con el tiempo, se espera que Visual Basic 6 seguirá el camino de muchos idiomas heredados, tanto en términos de información disponible, como de reserva de talentos.

Migración a Visual Basic .NET

Esta opción supone migrar completamente una aplicación de Visual Basic 6 a Visual Basic .NET.

Ventajas:

Acceso a la tecnología: Migrar una aplicación a Visual Basic .NET es la mejor manera de garantizar que podrá incorporar con rapidez las últimas innovaciones y tecnologías. Microsoft y otras compañías centran mucho sus esfuerzos en la funcionalidad para .NET Framework. Esto significa que los nuevos SDK favorecerán y posiblemente sólo trabajarán con los lenguajes .NET. Las nuevas tecnologías como los servicios web, actualización automática de aplicaciones y funcionalidad de Internet (compatibilidad http y ftp) se encuentran disponibles de forma nativa en las aplicaciones .NET, pero no se migrarán completamente de regreso a Visual Basic 6. Sitios como GotDotNet y SourceForge contienen miles de componentes redistribuibles, incluido el código fuente, que se pueden usar directamente en aplicaciones .NET.

Productividad de los desarrolladores: Además, las nuevas versiones de Visual Studio, que son muchísimo más productivas que Visual Studio 6.0, sólo se pueden usar con aplicaciones de .NET.

Desventajas:

Riesgo: Migrar una aplicación completa de Visual Basic 6 a Visual Basic .NET no es fácil. Si la aplicación es crítica y los desarrolladores no tienen experiencia en Visual Basic .NET existe el riesgo de que la migración no se realice correctamente.

Tiempo: Se necesita cierto tiempo para migrar una aplicación y llegar al punto en que haga en .NET lo que lo hacía en Visual Basic 6. Aunque deje a la aplicación en una condición mucho más favorable para futuras mejoras, no se puede ignorar los tiempos y costos necesarios para migrar.

Visual Basic Fusion

Visual Basic Fusion es el acto de usar las funcionalidades de .NET desde una aplicación de Visual Basic 6.

Ventajas:

Acceso a la tecnología: Al escribir pequeñas correcciones de Visual Basic .NET, puede tener acceso a la biblioteca de clases completa de .NET Framework, llamar servicios web o usar bibliotecas .NET de terceros o de código abierto desde sus aplicaciones Visual Basic 6.

Bajo riesgo: La mayor parte del código de aplicación permanece en Visual Basic 6 y continúa funcionando tal como está. La cantidad de código de Visual Basic .NET que escribe es relativamente pequeña. Esto significa que no tiene el riesgo de una migración con errores, porque no migra la aplicación completa. Además, los desarrolladores no experimentados con Visual Basic .NET sólo deben aprender pequeñas partes de .NET Framework para tener acceso a la funcionalidad necesaria.

Alto rendimiento de la inversión: La inversión en este enfoque es muy baja comparada con migrar una aplicación completa, de modo que el rendimiento en la inversión es alto, especialmente a corto plazo.

Desventajas:

Visual Basic 6: Como la mayor parte de la aplicación permanece en Visual Basic 6, debe continuar el uso del IDE de Visual Basic 6 y del lenguaje Visual Basic 6 cuando trabaje en la aplicación. Este lenguaje y el IDE no son tan productivos como Visual Basic .NET.

Depuración: Para depurar de forma eficaz una aplicación que usa código de Visual Basic 6 y Visual Basic .NET, necesita tener ambos entornos de desarrollo abiertos al mismo tiempo y tener un conocimiento especial necesario para depurar de forma eficaz un programa entre Visual Basic 6 y Visual Basic .NET.

Desarrollo del contenedor: Para tener acceso a la funcionalidad .NET desde Visual Basic 6, debe escribir contenedores de las clases de .NET para que se puedan exponer como objetos COM que se usan desde Visual Basic 6. Estos contenedores no son necesarios si la aplicación completa se migra a Visual Basic .NET.

Uso del código de ejemplo

Este artículo incluye código de ejemplo que ilustra todos los temas tratados. El código de ejemplo se extraerá en una carpeta denominada "Best Practices Code". Dentro de esta carpeta, encontrará:

  1. Install.bat: se usa para registrar e instalar los contenedores .NET para que se puedan usar desde Visual Basic 6.

  2. NetFxWrapper: carpeta que contiene el código fuente de las clases contenedoras de Visual Basic .NET.

  3. Best Practices Visual Basic 6: carpeta que contiene el ejemplo de Visual Basic 6 que usa la clase contenedora.

  4. ComClass.zip: contiene el elemento de proyecto ComClass. Si coloca este archivo en la carpeta C:\Documents and Settings\[nombre de usuario]\Mis documentos\Visual Studio 2005\Templates\ItemTemplates entonces esta plantilla de elemento estará disponible en sus proyectos de Visual Basic Express.

Si Visual Studio 2005 o Visual Basic Express no están instalados, puede simplemente hacer doble clic en install.bat para registrar las clases contenedoras. A continuación puede abrir el proyecto de Visual Basic 6, ejecutarlo y examinar el código para ver cómo éste usa los contenedores.

Si dispone de Visual Studio 2005 o Visual Basic Express, también puede abrir el código fuente de las clases contenedoras y examinar cómo están construidas.

Conclusión

Visual Basic Fusion es un enfoque útil para aplicaciones de Visual Basic 6 existentes que se deben mejorar de forma continua. Visual Basic Fusion le permite tener acceso a todas las funcionalidades de .NET Framework desde sus aplicaciones existentes, sin volverlas a escribir. Para usar el enfoque de Visual Basic Fusion, debe crear clases contenedoras de Visual Basic .NET para tener acceso a las funcionalidades de .NET Framework. Con frecuencia, estas clases contenedoras son fáciles de escribir, pero debe seguir ciertas reglas para que se expongan correctamente como objetos COM. Este artículo le ha indicado recomendaciones para crear clases contenedoras y le ha ofrecido instrucciones para determinar si debe usar Visual Basic Fusion o algún otro enfoque, en las aplicaciones de Visual Basic 6 existentes.

Acerca del autor

Scott Swigart (http://www.swigartconsulting.com/) dedica su tiempo como consultor de compañías, a las que les enseña a aprovechar la tecnología actual y prepararse para la del futuro. También contribuye al sitio Visual Basic Fusion, donde ofrece información y tácticas de uso efectivo para desarrolladores de Visual Basic que desean generar la máxima funcionalidad con el mínimo esfuerzo. Scott también es MVP de Microsoft y coautor de varios libros y artículos. Si tiene preguntas o comentarios sobre este artículo, no dude en enviarlas por correo electrónico a scott@swigartconsulting.com.

Mostrar:
© 2014 Microsoft