Grimpi IT Blog

noviembre 12, 2008

Interop y cómo usar un componente .NET desde Visual Basic 6 y ASP

Filed under: .NET, Interop — Etiquetas: , , — grimpi @ 2:22 am

La tecnología COM fue la solución de Microsoft para el desarrollo de componentes reutilizables que puedan funcionar de manera distribuida y que sean independientemente del lenguaje de programación.
Con el desarrollo de .NET, COM quedo relegado. Sin embargo, muchos sistemas actualmente en producción, especialmente los desarrollados en VB 6 y ASP legacy, siguen usando esta tecnología.
Dado que existe una plataforma de desarrollo mucho más robusta y potente como .NET, es posible crear componentes en esta tecnología y que puedan ser invocados desde una aplicación VB 6 o ASP? La respuesta es afirmativa.
Dentro del Framework .NET, existe una librería llamada Interop que permite tanto usar un componente COM desde .NET como permitir llamar un assembly desde una aplicación COM.

Hoy vamos a explicar esto último, cómo usar un componente desarrollado en .NET desde ASP legacy o Visual Basic 6. La idea no es entrar en profundidad en este tema ni todas sus desventajas, sino hacer una guía rápida para el desarrollo de componentes COM en .NET.

  • El primer paso es crear explícitamente interface POR CADA clase que queremos exportar a COM. Si no lo hacemos, el compilador lo va a hacer solo, con el riesgo de perder compatibilidad binaria. Para decirle al compilador que no genera una interface por cada clase a exportable, hay que poner en el archivo assembly esta sentencia:

[assembly: ClassInterface(ClassInterfaceType.None)]

  • Hay que indicar como queremos que se instancien las clases COM (Late binding o Early bindin o ambos). Si queremos que se puedan crear de las 2 maneras, en cada interfaz hay que poner el atributo:

    [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsDual)]

    Si solo queremos Late bindig hay que poner (recomendado)

    [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsDispatch)]

  • Las clases que no se desean exportar a COM deben tener el atributo ComVisible(false)
  • Se debe firmar el componente, ya sea usando el programa sn.exe –k o directamente desde la IDE (esto solo se puede con VS 2005/2008).
  • Una vez compilado, se debe usar el programa Gacutil.exe para poner el assembly en la GAC (mas info sobre la GAC aca) y regasm.exe para generar y registrar el TLB del assembly.
    Ejemplo:

regasm Nombre.dll /tlb: Nombre.tlb

gacutil /i Nombre.dll

Para deregistrar el componente, hay que ingresar

regasm /u Nombre.dll /tlb: Nombre.tlb

gacutil /u Nombre.dll

Lamentablemente por alguna razón, el instalador de Visual Studio 2005/2008 no viene con el regasm.exe, por lo cual para conseguirlo es necesario descargar todo el SDK de .NET (http://www.microsoft.com/downloads/details.aspx?FamilyID=fe6f2099-b7b4-4f47-a244-c96d69c35dec&displaylang=en).

  • Una vez registrada el tlb, podemos usarlo desde VB 6 como si fuera un típico componente COM tradicional.

Consideraciones y Restricciones:

  1. Los constructores con parámetros no se pueden exportar a COM.
  2. Cuando se pasa un parametro variant en ASP o VB6 a un metodo de .NET se debe pasar entre parentesis. Sino genera el error Invalid Procedure or call Argument.
    Ejemplo:
    call ClaseInstancia.MetodoNuevo((ParametroVariant),OtroParametro)
  3. No se pueden usar NullTypes ni Generics.
  4. El paso de .NET a COM, requiere de una capa intermedia (marshaling), que por supuesto tiene un costo de procesamiento, algo que hay que tener en cuenta en sitios con alta cantidad de usuarios.
  5. Interop debe ser entendido y usado como una solución de corto y mediano plazo, para facilitar la migración de un sistema VB 6/ASP legacy a la plataforma .NET, no como una práctica recomendable.

4 comentarios »

  1. I was wondering if you ever thought of changing the
    layout of your website? Its very well written; I love what youve
    got to say. But maybe you could a little more
    in the way of content so people could connect with it better.
    Youve got an awful lot of text for only having 1 or two images.
    Maybe you could space it out better?

    Comentario por mouse click the up coming document — mayo 2, 2013 @ 12:03 am

  2. […] […]

    Pingback por Invocar desde VB6 un servicio web con ws-security — junio 26, 2014 @ 11:39 pm

  3. s

    Comentario por Anónimo — septiembre 23, 2015 @ 12:01 am

  4. Buen dato.

    Me ocurre algo curioso, despues de que registro la DLL (C:\Windows\Microsoft.NET\Framework\v2.0.50727>RegAsm.exe C:\development\NET\Libx\Libx\bin\Debug\Libx.dll /codebase /tlb:Libx.tlb /verbose) puedo usarla perfectamente pero si reinicio el IIS la DLL deja de funcionar, es casi como si al reinicar el IIS se borrara la DLL o como si al registrarla unicamente la registrara para una sesion. Hice la prueba de reiniciar el equipo y esto hizo que la DLL dejara de funcionar.

    ¿Por qué ocurre esto?

    Comentario por Anónimo — septiembre 23, 2015 @ 12:07 am


RSS feed for comments on this post. TrackBack URI

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Crea un blog o un sitio web gratuitos con WordPress.com.

A %d blogueros les gusta esto: