Integración de Controles OCX en Aplicaciones C#

La integración de controles OCX (ActiveX) en aplicaciones C# es un proceso bien soportado por Microsoft a través de su capa de interoperabilidad COM. Este artículo detalla los métodos y pasos necesarios para utilizar estos controles en entornos .NET.

Fundamentos de la Interoperabilidad

C# utiliza el concepto de "Runtime Callable Wrapper" (RCW) para envolver los componentes COM como clases .NET accesibles. Este mecanismo abstrae la complejidad de las interfaces COM tradicionales.

Proceso de Integración

Tomaremos como ejemplo un control hipotético "SelectorFechas.ocx" para ilustrar el proceso.

Paso 1: Registro del Control OCX

Antes de poder utilizar el control, debe registrarse en el sistema:

  1. Abrir el Símbolo del sistema como administrador.
  2. Registrar el control mediante el comando: ``` regsvr32 "C:\Ruta\Al\Control\SelectorFechas.ocx"
3. Confirmar el mensaje de éxito que indica el registro correcto.

> **Nota**: Para controles OCX de 32 bits en sistemas de 64 bits, copie el archivo a `C:\Windows\SysWOW64\` y utilice el `regsvr32.exe` de esa carpeta.

#### Paso 2: Agregar Referencia en Visual Studio

Este paso permite que el proyecto C# reconozca el control OCX:

1. En el **Explorador de soluciones**, hacer clic derecho en **"Referencias"** del proyecto.
2. Seleccionar **"Agregar referencia..."**.
3. Navegar a la pestaña **"COM"**.
4. Localizar el control OCX en la lista (aparecerá con su nombre descriptivo del registro).
5. Si no está visible, usar el botón **"Examinar..."** para seleccionar el archivo `.ocx` directamente.
6. Aceptar la selección.

**¿Qué ocurre después?**
Visual Studio genera automáticamente dos ensamblados:

1. El **Ensamblado de Interoperabilidad Principal** (ej. `Interop.ControlNombre.dll`).
2. El **Wrapper para Windows Forms** (ej. `AxInterop.ControlNombre.dll`), que es el componente arrastrable en el diseñador.

#### Paso 3: Utilización en el Diseñador (Arrastrar y Soltar)

Para aplicaciones Windows Forms, este es el método más intuitivo:

1. Abrir el diseñador del formulario (ej. `Form1.cs [Diseño]`).
2. En el **Cuadro de herramientas**, debería aparecer una nueva sección con el control OCX (ej. "AxSelectorFechas").

*Si no es visible, haga clic derecho en el Cuadro de herramientas → "Elegir elementos..." → En la pestaña "Componentes COM", localice y seleccione el control.*
3. Arrastrar el control al formulario.
4. Visual Studio genera automáticamente el código en `Form1.Designer.cs`:


// Form1.Designer.cs private AxSelectorFechasLib.AxSelectorFechas axSelectorFechas1;

private void InitializeComponent() { this.axSelectorFechas1 = new AxSelectorFechasLib.AxSelectorFechas(); ((System.ComponentModel.ISupportInitialize)(this.axSelectorFechas1)).BeginInit(); // ... otra inicialización this.Controls.Add(this.axSelectorFechas1); // ... otra inicialización ((System.ComponentModel.ISupportInitialize)(this.axSelectorFechas1)).EndInit(); }


#### Paso 4: Creación Dinámica por Código

Para mayor flexibilidad o en proyectos que no usan Windows Forms (como WPF), podemos crear el control programáticamente.

**En Windows Forms:**


public partial class Form1 : Form { private AxSelectorFechasLib.AxSelectorFechas miSelector;

public Form1()
{
    InitializeComponent();
    
    // Crear instancia del control
    miSelector = new AxSelectorFechasLib.AxSelectorFechas();
    ((System.ComponentModel.ISupportInitialize)miSelector).BeginInit();

    // Configurar propiedades
    miSelector.Location = new Point(10, 10);
    miSelector.Size = new Size(300, 200);
    miSelector.ColorFondo = Color.WhiteSmoke;

    // Agregar al formulario
    this.Controls.Add(miSelector);
    ((System.ComponentModel.ISupportInitialize)miSelector).EndInit();

    // Suscribir eventos
    miSelector.FechaSeleccionada += new EventHandler(MiSelector_FechaSeleccionada);
}

private void MiSelector_FechaSeleccionada(object sender, EventArgs e)
{
    // Manejar evento de cambio de fecha
    MessageBox.Show($"Fecha seleccionada: {miSelector.FechaActual}");
}

}


**En WPF (mediendo WindowsFormsHost):**
WPF no puede alojar directamente controles ActiveX, requiere el componente `WindowsFormsHost` como puente.

1. Agregar referencias a `System.Windows.Forms` y `WindowsFormsIntegration`.
2. En XAML: ```
<Window x:Class="AppWPF.VentanaPrincipal"
        xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
        xmlns:ax="clr-namespace:AxSelectorFechasLib;assembly=AxInterop.SelectorFechasLib">
    <Grid>
        <WindowsFormsHost>
            <ax:AxSelectorFechas x:Name="controlSelector"/>
        </WindowsFormsHost>
    </Grid>
</Window>

O bien crearlo dinámicamente en el código subyacente.

Paso 5: Utilización de Funcionalidades

Una vez agregado el control, podemos interactuar con él como cualquier otro control .NET:

  • Establecer/obtener propiedades:
axSelectorFechas1.FechaSeleccionada = DateTime.Today;
DateTime fechaActual = axSelectorFechas1.FechaActual;

  • Llamada a métodos:
axSelectorFechas1.MesSiguiente();

  • Manejo de eventos: En la ventana de propiedades, buscar los eventos del control y hacer doble clic para generar los manejadores.

Problemas Comunes y Soluciones

1. Error "No se pueden insertar los tipos de interoeprabilidad"

Mensaje: No se pueden insertar los tipos de interoperabilidad 'XXX'. Considere el uso de las interfaces correspondientes.

Solución:

  1. En el Explorador de soluciones, localizar la referencia COM correspondiente.
  2. Hacer clic derecho → "Propiedades".
  3. Cambiar la propiedad "Insertar tipos de interoperabilidad" a False.

2. Problemas de Implementación

La aplicación funciona en el equipo de desarrollo pero falla en los clientes con errores de control no encontrado o clase no registrada.

Soluciones:

  1. Verificar registro del OCX: Asegurarse de que el control esté registrado en la máquina destino mediante regsvr32.
  2. Incluir ensamblados de interoperabilidad: Distribuir los archivos Interop.XXX.dll y AxInterop.XXX.dll con la aplicación.
  3. Usar proyecto de instalación: Para implementaciones formales, crear un instalador (ClickOnce o MSI) que registre automáticamente el OCX.

3. Problemas de Hilos

Importante: Toda interacción con controles ActiveX debe ocurrir en el hilo donde fue creado (normalmente el hilo UI principal). En hilos en segundo plano, usar Control.Invoke.

// Actualizar control desde hilo en segundo plano
if (axSelectorFechas1.InvokeRequired)
{
    axSelectorFechas1.Invoke(new Action(() => {
        axSelectorFechas1.FechaActual = DateTime.Now;
    }));
}
else
{
    axSelectorFechas1.FechaActual = DateTime.Now;
}

Resumen del Proceso

Etapa Operación Clave Descripción
1 Registrar OCX Usar regsvr32 para registrar el control en el sistema.
2 Agregar referencia COM Introducir el control mediante "Agregar referencia" → "COM".
3 Utilizar control Diseño: Arrastrar desde el cuadro de herramientas. Ejecución: Crear instancia con new.
4 Programación Usar propiedades, métodos y eventos como controles .NET normales.
5 Implementación Asegruar OCX registrado y ensamblados de interoperabilidad presentes.

Aunque la tecnología OCX/ActiveX es considerada antigua, la capa de interoperabilidad de .NET permite integrar estos contoles en aplicaciones C# de manera eficiente, especialmente en sistemas heredados o cuando se utilizan componentes especializados sin equivalentes .NET.

Etiquetas: OCX C# Interoperabilidad COM Windows Forms WPF

Publicado el 7-26 12:44