Implementar componentes COM con ClickOnce

La implementación de componentes COM heredados ha sido tradicionalmente una tarea difícil. Los componentes deben estar registrados globalmente y, por tanto, pueden causar efectos secundarios no deseados entre aplicaciones superpuestas. En general, esta situación no es un problema en las aplicaciones de .NET Framework porque los componentes están completamente aislados para una aplicación o son compatibles en paralelo. Visual Studio permite implementar componentes COM aislados en el sistema operativo Windows.

ClickOnce proporciona un mecanismo fácil y seguro para implementar las aplicaciones .NET. Aun así, si las aplicaciones usan componentes COM heredados, deberá llevar a cabo unos pasos adicionales para implementarlos. En este tema se describe cómo implementar componentes COM aislados y hacer referencia a componentes nativos (por ejemplo, desde Visual Basic 6.0 o Visual C++).

Para obtener más información sobre la implementación de componentes COM aislados, consulte Simplificación de la implementación de aplicaciones con ClickOnce y COM sin registro.

COM sin registro

COM sin registro es una nueva tecnología que permite implementar y activar componentes COM aislados. Para ello, coloca toda la información de registro y biblioteca de tipos del componente, que suele instalarse en el Registro del sistema, en un archivo XML denominado manifiesto, que se almacena en la misma carpeta que la aplicación.

Para aislar un componente COM hay que registrarlo en el equipo del desarrollador, pero no es necesario registrarlo en el equipo del usuario final. Para aislar un componente COM, lo único que debe hacer es establecer la propiedad Isolated de su referencia en True. De forma predeterminada, esta propiedad está establecida en False, lo que indica que se debe tratar como una referencia COM registrada. Si esta propiedad es True, se genera un manifiesto para este componente en tiempo de compilación. Además, los archivos correspondientes se copian en la carpeta de la aplicación durante la instalación.

Cuando el generador de manifiestos encuentra una referencia COM aislada, enumera todas las entradas CoClass de la biblioteca de tipos del componente, para lo que hace coincidir cada entrada con sus datos de registro correspondientes y genera definiciones de manifiesto para todas las clases COM del archivo de biblioteca de tipos.

Implementación de componentes COM sin registro mediante ClickOnce

La tecnología de implementación ClickOnce es adecuada para implementar componentes COM aislados, ya que ClickOnce y COM sin registro requieren que un componente tenga un manifiesto para implementarse.

Normalmente, el autor del componente debe proporcionar un manifiesto. A pesar de ello, si no es así, Visual Studio es capaz de generar automáticamente un manifiesto para un componente COM. La generación de manifiestos se realiza durante el proceso de publicación de ClickOnce; para obtener más información, consulte Publicación de aplicaciones ClickOnce. Esta característica también le permite aprovechar los componentes heredados que haya creado en entornos de desarrollo anteriores, como Visual Basic 6.0.

ClickOnce implementa componentes COM de dos maneras:

  • Usa el programa previo para implementar los componentes COM; esto funciona en todas las plataformas compatibles.

  • Usa la implementación de aislamiento de componentes nativos (también conocido como COM sin registro).

Ejemplo de aislamiento e implementación de un componente COM simple

Para mostrar la implementación de componentes COM sin registro, en este ejemplo se creará una aplicación basada en Windows en Visual Basic que hace referencia a un componente COM nativo aislado creado con Visual Basic 6.0 y se implementará con ClickOnce.

En primer lugar, deberá crear el componente COM nativo:

Para crear un componente COM nativo
  1. Con Visual Basic 6.0, en el menú Archivo, haga clic en Nuevo y en Proyecto.

  2. En el cuadro de diálogo Nuevo proyecto, seleccione el nodo Visual Basic y elija un proyecto DLL ActiveX. En el cuadro Nombre , escriba VB6Hello.

    Nota

    Solo se admiten los tipos de proyecto DLL ActiveX y Control ActiveX con COM sin registro. No se admiten los tipos de proyecto EXE ActiveX y Documento ActiveX.

  3. En el Explorador de soluciones, haga doble clic en Class1.vb para abrir el editor de texto.

  4. En Class1.vb, agregue el código siguiente después del código generado para el método New:

    Public Sub SayHello()
       MsgBox "Message from the VB6Hello COM component"
    End Sub
    
  5. Compile el componente. En el menú Compilar, haga clic en Compilar solución.

Nota

COM sin registro solo admite tipos de proyecto de controles COM y DLL. No puede usar archivos EXE con COM sin registro.

Ahora puede crear una aplicación basada en Windows y agregarle una referencia al componente COM.

Para crear una aplicación basada en Windows mediante un componente COM
  1. Con Visual Basic, en el menú Archivo, haga clic en Nuevo y en Proyecto.

  2. En el cuadro de diálogo Nuevo proyecto, seleccione el nodo Visual Basic y elija Aplicación Windows. En el cuadro Nombre , escriba RegFreeComDemo.

  3. En el Explorador de soluciones, haga clic en el botón Mostrar todos los archivos para mostrar las referencias del proyecto.

  4. Haga clic con el botón derecho en el nodo Referencias y seleccione Agregar referencia desde el menú contextual.

  5. En el cuadro de diálogo Agregar referencia, haga clic en la pestaña Examinar, vaya a VB6Hello.dll y selecciónelo.

    Aparecerá una referencia VB6Hello en la lista de referencias.

  6. Apunte al Cuadro de herramientas, seleccione un control Botón y arrástrelo al formulario Form1.

  7. En la ventana Propiedades, establezca la propiedad Text del botón en Hello.

  8. Haga doble clic en el botón para agregar código de controlador y, en el archivo de código, agregue código para que en el controlador aparezca lo siguiente:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim VbObj As New VB6Hello.Class1
        VbObj.SayHello()
    End Sub
    
  9. Ejecute la aplicación. En el menú Depurar, haz clic en Iniciar depuración.

    A continuación, debe aislar el control. Cada componente COM que usa la aplicación se representa en el proyecto como una referencia COM. Estas referencias son visibles en el nodo Referencias de la ventana del Explorador de soluciones. (Tenga en cuenta que puede agregar referencias directamente con el comando Agregar referencia en el menú Proyecto, o bien indirectamente si arrastra un control ActiveX al formulario).

    En los pasos siguientes se muestra cómo aislar el componente COM y publicar la aplicación actualizada que contiene el control aislado:

Para aislar un componente COM
  1. En el Explorador de soluciones, en el nodo Referencias, seleccione la referencia VB6Hello.

  2. En la ventana Propiedades, cambie el valor de la propiedad Isolated de False a True.

  3. En el menú Compilar, haga clic en Compilar solución.

    Al presionar F5, la aplicación funciona según lo previsto, pero ahora se ejecuta con COM sin registro. Para comprobarlo, pruebe a anular el registro del componente VB6Hello.dll y ejecutar RegFreeComDemo1.exe fuera del IDE de Visual Studio. Esta vez, cuando se hace clic en el botón, sigue funcionando. Si cambia temporalmente el nombre del manifiesto de aplicación, se producirá un error de nuevo.

Nota

Para simular la ausencia de un componente COM, anule temporalmente su registro. Abra un símbolo del sistema, escriba cd /d %windir%\system32 para ir a la carpeta del sistema y escriba regsvr32 /u VB6Hello.dll para anular el registro del componente. Para volver a registrarlo, escriba regsvr32 VB6Hello.dll.

El último paso consiste en publicar la aplicación mediante ClickOnce:

Para publicar una actualización de aplicación con un componente COM aislado
  1. En el menú Compilar, haga clic en Publicar RegFreeComDemo.

    Aparece el Asistente para publicación.

  2. En el Asistente para publicación, especifique una ubicación en el disco del equipo local donde puede acceder a los archivos publicados y examinarlos.

  3. Haga clic en Finalizar para publicar la aplicación.

    Si examina los archivos publicados, observará que se incluye el archivo sysmon.ocx. El control está totalmente aislado para esta aplicación, lo que significa que si el equipo del usuario final tiene otra aplicación que usa una versión diferente del control, no interferirá con esta aplicación.

Referencia a ensamblados nativos

Visual Studio admite referencias a ensamblados nativos de Visual Basic 6.0 o C++; estas referencias se denominan referencias nativas. Para saber si una referencia es nativa, compruebe que su propiedad Tipo de archivo está establecida en Nativo o ActiveX.

Para agregar una referencia nativa, use el comando Agregar referencia y vaya al manifiesto. Algunos componentes colocan el manifiesto dentro del archivo DLL. En este caso, basta con que elija el propio archivo DLL y Visual Studio lo agregará como referencia nativa si detecta que el componente contiene un manifiesto insertado. Visual Studio también incluirá automáticamente los archivos o ensamblados dependientes que se enumeran en el manifiesto si se encuentran en la misma carpeta que el componente al que se hace referencia.

El aislamiento de controles COM facilita la implementación de componentes COM que aún no tienen manifiestos. Aun así, si se proporciona un componente con un manifiesto, puede hacer referencia al manifiesto directamente. De hecho, siempre que sea posible debe usar el manifiesto que proporciona el autor del componente, en lugar de usar la propiedad Isolated.

Limitaciones de la implementación de componentes COM sin registro

COM sin registro proporciona claras ventajas sobre las técnicas de implementación tradicionales.

No todos los componentes son un candidato adecuado para COM sin registro. Un componente no es adecuado si se cumple alguna de las condiciones siguientes:

  • El componente es un servidor fuera de proceso. No se admiten servidores EXE; solo se admiten archivos DLL.

  • El componente forma parte del sistema operativo o es un componente del sistema, como XML, un componente del explorador o componentes de Microsoft Data Access (MDAC). Debe seguir la directiva de redistribución del autor del componente; póngase en contacto con su proveedor.

  • El componente forma parte de una aplicación, como Microsoft Office. Por ejemplo, no debe intentar aislar el modelo de objetos de Microsoft Excel. Forma parte de Office y solo se puede usar en un equipo que tenga instalado el producto de Office completo.

  • El componente está diseñado para usarse como complemento, por ejemplo, un complemento de Office o un control en un explorador web. Normalmente, estos componentes requieren algún tipo de esquema de registro definido por el entorno de hospedaje que está fuera del ámbito del manifiesto en sí mismo.

  • El componente administra un dispositivo físico o virtual para el sistema, por ejemplo, un controlador de dispositivo para un administrador de trabajos de impresión.

  • El componente es un componente redistribuible de acceso a datos. Por lo general, para poder ejecutarse, las aplicaciones de datos requieren que se instale un componente redistribuible de acceso a datos independiente. No debe intentar aislar componentes como el control de datos de Microsoft ADO, Microsoft OLE DB o Componentes de Microsoft Data Access (MDAC). En su lugar, si la aplicación usa MDAC o SQL Server Express, debe establecerlos como requisitos previos; consulte Cómo instalar requisitos previos con una aplicación ClickOnce.

    En algunos casos, el desarrollador del componente podría rediseñarlo para COM sin registro. Si esto no es posible, igualmente puede compilar y publicar aplicaciones que dependan de ellos mediante el esquema de registro estándar con el programa previo. Para obtener más información, consulte Creación de paquetes de programa previo.

    Un componente COM solo se puede aislar una vez por aplicación. Por ejemplo, no se puede aislar el mismo componente COM de dos proyectos diferentes de biblioteca de clases que forman parte de la misma aplicación. Si lo hace, se producirá una advertencia de compilación y la aplicación no se cargará en tiempo de ejecución. Para evitar este problema, Microsoft recomienda encapsular los componentes COM en una sola biblioteca de clases.

    Hay varios escenarios en los que se requiere el registro COM en el equipo del desarrollador, aunque la implementación de la aplicación no requiera registro. La propiedad Isolated requiere que el componente COM se registre en el equipo del desarrollador para generar automáticamente el manifiesto durante la compilación. No hay ninguna funcionalidad de captura de registros que invoque el registro automático durante la compilación. Además, las clases que no estén definidas explícitamente en la biblioteca de tipos no se reflejarán en el manifiesto. Cuando se usa un componente COM con un manifiesto preexistente, como una referencia nativa, es posible que el componente no tenga que registrarse en tiempo de desarrollo. Aun así, es necesario registrarlo si el componente es un control ActiveX y quiere incluirlo en el Cuadro de herramientas y el diseñador de Windows Forms.