La recuperación de la fábrica de clase COM para el componente con CLSID {XXXX} falló debido al siguiente error: 80040154

278

Desarrollé un servicio de Windows usando C # .NET para generar un informe en PDF. Para generar un archivo PDF, estoy usando un dll de terceros. La aplicación se ejecuta en mi plataforma Windows XP. Cuando implementé el servicio en la versión de 64 bits de Windows Server 2008 , recibí este error:

La recuperación de la fábrica de la clase COM para componentes con CLSID {46521B1F-0A5B-4871-A4C2-FD5C9276F4C6} falló debido al siguiente error: 80040154.

Registré la DLL usando el comando regsvr32. Puedo ver este CLSID en el registro. Pero el problema persiste.

¿Cual podría ser el problema?

gopal
fuente
1
Una aplicación web alojada en el mismo servidor puede generar archivos PDF sin ningún error.
gopal
Chicos, probé todas las soluciones posibles, pero aún obtengo este error. Tengo ensamblados y los registré con éxito pero sigo recibiendo el mismo error. Realmente necesito ayuda ...
newprogress

Respuestas:

383

En VS - propiedades del proyecto - en la pestaña Build - target de plataforma = X86

Fabrice MARIANADIN
fuente
77
en VS2008 encontré esta opción en 'Compilar-> Opciones de compilación avanzadas ...' (en la parte inferior de la pestaña de la ventana) y luego 'CPU de destino' (x86)
Rodolfo
1
Te mereces más que un +1 pero +1 es todo lo que tengo para darte
David
77
Esta no siempre es la solución.
2
Me has guardado siete cuentas bancarias en el extranjero, un puesto de perritos calientes y mi matrimonio. Gracias
Donald.Record
2
Tengo el mismo mensaje de error pero esta solución no funciona para mí.
Akram Khan
59

Me encontré con un problema muy similar.

Necesitaba usar una vieja DLL de 32 bits dentro de una aplicación web que se estaba desarrollando en una máquina de 64 bits. Registré la DLL de 32 bits en la carpeta windows \ sysWOW64 usando la versión de regsrv32 en esa carpeta.

Las llamadas a la DLL de terceros funcionaron desde pruebas unitarias en Visual Studio pero fallaron desde la aplicación web alojada en IIS en la misma máquina con el error 80040154.

Cambiar el grupo de aplicaciones a "Habilitar aplicaciones de 32 bits" resolvió el problema.

Daniel Ballinger
fuente
1
Esta es la forma más fácil que he encontrado para solucionar este problema. ¡Gracias!
dexter
66
Realmente amo esta respuesta. No tiene sentido compilar un sitio web completo para x86 cuando solo estás llamando a una pequeña DLL de 32 bits en algún momento.
DanM7
@Daniel Ballinger ¿Mi aplicación se ejecutará como un proceso de 32 bits al hacer el cambio?
Novato
@Danny No lo creo, ya que no podría acceder a la DLL que registré en sysWOW64.
Daniel Ballinger
1
Tengo el mismo problema, pero no sé cómo cambiar el grupo de aplicaciones, ¿dónde debo hacer esto? Por
favor
58

Parece que su servicio fue construido contra 'Cualquier CPU', causándole errores en 64 bits donde está usando componentes COM. Necesitas construirlo para x86.

El sitio web probablemente se esté ejecutando como un proceso de 32 bits, por lo que puede usar el componente. Construir su solución contra x86forzará su servicio a ejecutarse como 32 bits.

stevehipwell
fuente
También estoy enfrentando el mismo problema ... donde mi aplicación de escritorio se instaló con éxito en un sistema de 64 bits ... mientras realizaba la instalación, realicé la sincronización con éxito, pero cuando realizo la sincronización desde mi software, me muestra el error anterior
Mohini Mhetre
Estoy intentando registrarme .ocx file (c:\Windows\SysWow>RegSvr32 genX.ocx)pero obtengo un error. El módulo no se pudo cargar. Asegúrese de que el archivo binario esté almacenado en la ruta especificada o depúrelo para verificar si hay problemas con el archivo binario o archivos .DLL dependientes.
Naveen Kumar
Y si está compilado como 32 bits, entonces se debe usar el sistema regsvr32, no la versión SysWow64.
Fandango68
Recibo este error al ejecutar el paquete SSIS. Las conexiones funcionan bien. Todas las propiedades son correctas. En realidad, el paquete SSIS se ejecutó desde hace muchos meses sin ningún error. De repente me estoy poniendo por encima del error. Traté de cambiar el tiempo de ejecución / depuración a x86 de x64 aún no se ha resuelto el problema.
IamVISH
16

No tiene que configurar el objetivo de la plataforma de propiedades del proyecto X86. También puede configurar las opciones de iis para trabajar con x86 como ese

  • Seleccionar grupo de aplicaciones
  • Seleccione el grupo que usa su aplicación
  • Ajustes avanzados
  • Habilitar aplicaciones de 32 bits verdaderas
nazim hatipoglu
fuente
Esto siempre ha sido cierto para mí. Nunca tuve que establecer el objetivo de la plataforma en X86, pero siempre • Habilitar aplicaciones de 32 bits = Verdadero • Establecer identidad = ApplicationPoolIdentity • Cargar perfil de usuario = Verdadero
Zath.
Tuve un problema similar que se solucionó según las instrucciones de Nazim, pero que también no tenía que "Insertar tipos de interoperabilidad" (una propiedad del dll al que se hace referencia) y establecer Copiar local = verdadero.
cymorg
¿Cómo se "selecciona el grupo de aplicaciones"?
CodyBugstein
El menú de
Grupos de
16

Si está buscando una manera de hacer que esto funcione sin recompilar su aplicación Any CPU, aquí hay otra solución potencial:

  1. Ubique su GUID de objeto COM en HKey_Classes_Root \ Wow6432Node \ CLSID \ {GUID}
  2. Una vez ubicado, agregue un nuevo valor REG_SZ (cadena). El nombre debe ser AppID y los datos deben ser el mismo GUID de objeto COM que acaba de buscar
  3. Agregue una nueva clave en HKey_Classes_Root \ Wow6432Node \ AppID. La nueva clave debe llamarse igual que el GUID del objeto COM.
  4. Bajo la nueva clave que acaba de agregar, agregue un nuevo valor de cadena y llámelo DllSurrogate. Deje el valor en blanco.
  5. Cree una nueva clave en HKey_Local_Machine \ Software \ Classes \ AppID \ Nuevamente, la nueva clave debe llamarse igual que el GUID del objeto COM. No es necesario agregar valores bajo esta clave.

No tomo crédito por la solución, pero funcionó para nosotros. Consulte el enlace de origen para obtener más información y otros comentarios.

Fuente: https://techtalk.gfi.com/32bit-object-64bit-environment/

Joshua Starner
fuente
1
La mayoría de las excelentes instrucciones. Estaba usando una herramienta de terceros, dejándome incapaz de cambiar la plataforma de compilación. Esta solución evitó ese problema. ¡Gracias!
Encontré la clave como usted describió en el paso 1, y luego supe qué objeto COM está causando los problemas, luego ejecuté regsvr32 en él. ¡Muchas gracias!
MichaelS
Cuando hice esto, mi servidor web local (IIS) comenzó a obtener acceso denegado. Esto me dice que este fue un paso en la dirección correcta, pero no estoy seguro de a quién dar acceso en este momento. stackoverflow.com/questions/14019401/…
user420667
14

El problema es que el proceso del servidor es de 64 bits y la biblioteca es de 32 bits e intenta crear el componente COM en el mismo proceso (servidor en proceso). O recompila el servidor y lo hace de 32 bits o deja el servidor sin cambios y deja el componente COM fuera de proceso. La forma más fácil de hacer que un servidor COM esté fuera de proceso es crear una aplicación COM + - Panel de control -> Herramientas administrativas -> Servicios de componentes.

diente filoso
fuente
Encontré un error al intentar crear una aplicación COM +. An error occurred while processing the last operation. [Error code 00690075] The event log may contain additional troubleshooting information.
KZee
8

No cambié ninguna configuración de compilación.

Simplemente configure "Habilitar aplicación de 32 bits = Verdadero" en la Configuración avanzada de AppPool.

Funciono para mi

Eduardo Xavier
fuente
1
¿Dónde está la configuración avanzada de AppPool?
CodyBugstein
7

La solución para Windows 2008 Server x64 es:

  1. Abra cmd.exe con permiso de administrador.
  2. Copie el dll a la carpeta C: \ Windows \ SysWOW64
  3. ejecute regsvr32 desde C: \ Windows \ SysWOW64
  4. Verifique que dll esté en el registro de Windows.
  5. Si tiene un .exe x86 que usa el dll, el exe debe compilarse en modo x86.
  6. El exe debe estar instalado en la carpeta C: \ Archivos de programa (x86)

Este procedimiento es válido, está bien.

Juan
fuente
6

Tuve el mismo problema, pero las otras respuestas solo proporcionaron una parte de la solución.

La solución es doble:

Elimine los 64 bits de Registery.

  • c: \ windows \ system32 \ regsvr32.exe / U
  • Esto no eliminará las referencias a otras copias de la dll en otras carpetas.

o

  • Busque la clave llamada HKEY_CLASSES_ROOT \ CLSID {......} \ InprocServer32. Esta clave tendrá el nombre de archivo de la DLL como su valor predeterminado.
  • Eliminé la carpeta HKEY_CLASSES_ROOT \ CLSID {......}.

Regístralo como 32 bits:

  • C:\Windows\SysWOW64\regsvr32 <file.dll>

Registrarlo como 32 bits sin eliminar el registro de 64 bits no resuelve mi problema.

Gerhard Powell
fuente
¡Bingo! Esa es la respuesta que estaba buscando (ver mis comentarios en otra parte). ¡Gracias!
Fandango68
5

Tuve un problema relacionado con una solución diferente pero similar:

Tenía un proyecto de servicio de Windows configurado en "Any-CPU" usando una DLL de 64 bits. Mismo mensaje de error. Intenté un montón de cosas, pero nada funcionó. Finalmente, entré en Propiedades del proyecto -> Compilar y noté que el proyecto tenía "Prefiero 32 bits" marcado. Desmarcó esto y no más errores.

Supongo que el servicio de Windows esperaba una DLL de 32 bits y no pudo encontrarla.

jinushaun
fuente
Aunque eso es extraño, pero funciona. Gracias
FindOutIslamNow
3

Para cambiar a x86:

  1. Cree un proyecto de configuración para su solución.
  2. Después de crearlo, vaya al Explorador de soluciones, haga clic con el botón derecho en el proyecto de configuración.
    • Presione Administrador de configuración.
    • Haga clic en: cuadro combinado "Active Solution Platform" y seleccione Nuevo (si no se muestra x86)
    • Seleccione desde el primer combo x86 y luego presione OK.
    • reconstruir el proyecto de instalación, luego reconstruir todo el proyecto.
ShouShouLeb
fuente
3

Si está ejecutando un sitio web, también puede intentar configurar su grupo de aplicaciones para deshabilitar las aplicaciones de 32 bits (en la configuración avanzada de un grupo).

Scramblor
fuente
2
Tuve lo contrario y tuve que habilitar aplicaciones de 32 bits.
fila1
2

En mi caso personal, el problema se solucionó buscando la identificación de la clase en el Registro de Windows en la máquina del desarrollador (porque el problema se lanzó en una PC cliente). Esta acción se colocará en el componente COM que causa el problema: una biblioteca x86 referenciada en mi proyecto .NET que no se estaba registrando como OCX / COM para el instalador o la aplicación de actualización.

Saludos

César Qüeb
fuente
1

Para cualquiera que usara VSTO, el problema para mí era una referencia faltante al officeensamblaje. También aparecería si intentara crear una instancia de ciertos objetos VSTO manualmente.

Alex
fuente
1

Descubrí que mi problema estaba relacionado con el registro real de la DLL.

Primero ejecute "Regedit.exe" desde un indicador de CMD (elevé su nivel de seguridad a Administrador, "por si acaso"), luego busque el Registro (haciendo clic en "Editar / Buscar" en el menú RegEdit o presionando Ctrl + F) para el CLSID que se muestra en el mensaje de error que recibió con respecto a la fábrica de la clase COM. Mi CLSID fue 29AB7A12-B531-450E-8F7A-EA94C2F3C05F. Cuando encuentre esta clave, seleccione la subclave "InProcServer2" en ese nodo de Hive y determine el nombre de archivo de la DLL del problema en el cuadro Regedit de la derecha. que se muestra en "Predeterminado". Si ese archivo reside en "C: \ Windows \ SysWow64" (como C: \ Windows \ SysWow64 \ Redemption.dll "), es importante que utilice el archivo" C: \ Windows \ SysWow64 \ RegSvr32.exe "para registre esa DLL desde la línea de comando y NO la predeterminada "C: C: \ Windows \ SysWow64 \ RegSvr32.exe c: \ Windows \ SysWow64 \ Redemption.dll la prensa enter. Cierre la ventana de comandos (a través de "Salir" y luego reinicie el ordenador (utilice siempre reinicio en lugar de cerrar a continuación la puesta en marcha, ya que (curiosamente) Reiniciar realizar un cierre a fondo hacia abajo y recarga de todo mientras que "cerrar" y Power-Up vuelve a cargar una caché almacenada de controladores y otros valores (que pueden ser defectuosos). Siempre que registre una DLL en el futuro, recuerde usar el SysWow64 "RegSvr32.exe" para cualquier DLL almacenada en la carpeta C: \ Windows \ SysWow64 y este problema c (si es causado por un registro incorrecto) no debe volver a ocurrir.

Chris Raisin
fuente
Gran consejo, pero tenga en cuenta que al registrar una DLL de 32 bits en SysWow64, se supone que la DLL tiene un contenedor para manejar solicitudes de 64 bits.
Fandango68
0

Mi problema fue que tenía la versión incorrecta de MS Sync FrameWork (1.0) en las referencias de mi proyecto. Después de actualizar a la versión 2.1, el error desapareció y la vida es buena nuevamente.

Phogrammer
fuente
0

En mi caso, estoy produciendo archivo de MS Office como wordo excel, corro Win+Ry ejecutar dcomcnfg, en el Configuración DCOM, además de seleccionar el artículo nombre relacionado OFICINA (como el nombre contiene Excelo Wordo Office) y Open the properties, select Identity tab and select the interactive user.como esta respuesta ,

CLSID {000209FF-0000-0000-C000-000000000046}Aparece mi mensaje de error , así que tengo que intentar encontrar este CLSID específico en la configuración de DCOM, y sale, y lo selecciono y sigo el mismo paso para configurarlo interactive user, luego funciona.

Yu Jang Jian
fuente