2011-01-12 19 views
5

Tengo una aplicación que utiliza algunas clases de un dll COM nativo en Despliegue aislado.¿Contexto de activación perdido al trabajar con WinForm?

Simplificado: En tiempo de ejecución descargo el dll con su archivo de manifiesto en un directorio determinado sin registrarlo. Luego creo un contexto de activación que apunta a ese directorio y luego crea instancias de clases desde el dll. Digamos que crear la clase A y luego una clase de tiempo B. En este flujo, todo va bien.

El problema comenzó cuando cambié mi aplicación para que fuera un WinForm. Cuando se presiona "botón 1", creo el contexto de activación como antes y luego creo una instancia de la clase A. Esto funciona bien y el flujo vuelve a mi WinForm. Sin embargo, cuando se presiona el "botón 2", no puedo crear la clase B. ¡Recibo una excepción que dice que no se puede encontrar la clase!

Parece que WinForm está jugando de alguna manera con mi contexto de Activación. - ¿Por qué es eso? ¿Lo que está sucediendo allí? - ¿Hay alguna forma de evitarlo?

Algunas notas: - Intenté seguir las creaciones del contexto de activación utilizando sxstrace.exe, sin embargo, solo registré mi creación de Contexto de Activación. - Intenté comentar Application.EnableVisualStyles() pero no sirvió de nada. - Si envuelvo cada llamada a mi dll con crear y destruir el contexto de activación, funciona pero, naturalmente, no quiero llegar allí ..

Respuesta

1

El CLR no garantiza mantener/preservar el contexto de activación de Win32 al pasar por código administrado

Una solución alternativa es llamar al código nativo, establecer el contexto de activación allí, hacer lo que necesite y restaurar el contexto. Probablemente solo lo necesite para cargar y enlazar al objeto, por lo que una vez que tiene un IUnknown, puede devolverlo.

Martyn

Cuestiones relacionadas