Pregunta

Escenario: Tengo un proyecto que contiene dos proyectos C #, que por razones históricas deben comunicarse entre sí mediante COM (a través de interoperabilidad COM). El servidor COM es un objeto de automatización en proceso (llame a esto el " Servidor ") y el cliente COM es una aplicación simple de consola C # que carga el servidor de esta manera:

        var objTypee = Type.GetTypeFromProgID("ProgID.Interop3264");
        var objLateBound = Activator.CreateInstance(objType);

Visual Studio registra automáticamente los ensamblajes para la interoperabilidad COM si esa opción está habilitada en la configuración del proyecto, así que eso es lo que uso para registrar el servidor (solo me interesa la experiencia del desarrollador aquí, la instalación es un problema independiente) y todo. funciona bien siempre y cuando los proyectos estén configurados para generar un código de 32 bits o el cliente COM sea de 32 bits.

El problema surge cuando se desarrolla en un sistema de 64 bits y ambos proyectos están configurados para generar código para 'Cualquier CPU', lo que hace que se ejecuten en modo de 64 bits. Esto produce el siguiente error:

"Retrieving the COM class factory for component with CLSID {6F597EDF-9CC8-4D81-B42E-1EA9B983AB02} failed due to the following error: 80040154."

Después de algunas investigaciones, parece que los scripts de MSBuild solo realizan el registro de 32 bits. Pone el ProgID en la sección de registro de 64 bits, junto con su subclave CLSID y el classID apropiado. Pero las cosas de CLSID {clsid} no están ahí. Solo está en el subárbol WOW6432, para 32 bits. Por lo tanto, el activador no puede recuperar la fábrica de clases porque no puede encontrar la cosa.

Estaré realmente impresionado con la comunidad SO si obtengo una respuesta a esta, pero aquí va:

¿Alguien más se ha topado con este problema? ¿Cómo lo resolviste? ¿Cuál es la forma más fácil de garantizar que los ensamblajes de interoperabilidad COM se registren correctamente en las máquinas de desarrollo de 64 bits?

¿Fue útil?

Solución

Hemos encontrado este problema y lo resolvimos configurando proyectos para generar ensamblajes para x86. Esto es subóptimo, por supuesto, pero también tenemos varias libretas nativas de 32 bits, así que tuvimos que hacerlo de todos modos.

Otros consejos

Pude resolver esto con el siguiente elemento de KB. Básicamente, desactive el registro para interoperabilidad COM en la configuración de compilación del proyecto y usé el comando posterior a la compilación:

"%Windir%\Microsoft.NET\Framework64\v2.0.50727\regasm" "$(TargetPath)" 

http://support.microsoft.com/kb/956933

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top