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

StackOverflow https://stackoverflow.com/questions/1036856

Pregunta

He desarrollado un servicio de Windows mediante C#.NET para generar el informe en formato PDF.Para generar el archivo PDF que estoy utilizando una tercera parte de dll.La aplicación se está ejecutando en mi plataforma de Windows XP.Cuando me enviaron el servicio en Windows Server 2008 La versión de 64 bits, tengo este error:

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

Me he registrado la DLL mediante el comando regsvr32.Yo capaz de ver este CLSID en el registro.Pero el problema persiste.

¿Cuál podría ser el problema?

¿Fue útil?

Solución

En VS - propiedades del proyecto - en la pestaña Construir - plataforma objetivo = X86

Otros consejos

Parece que su servicio fue construido contra 'Cualquier CPU', causándole errores en 64 bits donde está usando componentes COM. Necesita compilarlo 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 <=> obligará a su servicio a ejecutarse como 32 bits.

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 a partir de 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.

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

  • Seleccionar grupo de aplicaciones
  • Seleccione el grupo que usa su aplicación
  • Configuración avanzada
  • Habilitar aplicaciones de 32 bits true

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

  1. Localice 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 vacío.
  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 & # 8217; 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- Entorno de 64 bits /

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 - & Gt; Herramientas administrativas - & Gt; Servicios de componentes.

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

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

Funcionó para mí

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.

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

Tenía un proyecto de servicio de Windows establecido 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 - & Gt; Compila y notó que el proyecto tenía & "; Prefiero 32 bits &"; comprobado. Desmarcó esto y no más errores.

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

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á 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 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.

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: " Active Solution Platform " cuadro combinado y seleccione Nuevo (si no se muestra x86)
    • Seleccione del primer combo x86 y luego presione OK.
    • reconstruir el proyecto de instalación, luego reconstruir todo el proyecto.

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).

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

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

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.

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

Primero ejecute " Regedit.exe " desde un indicador CMD (elevé su nivel de seguridad a Administrador, & "; en caso de que &";) luego busque el Registro (haciendo clic en & "; Editar / Buscar &"; en RegEdit menu 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 se encuentra esta clave, seleccione la subclave " InProcServer2 " debajo de ese nodo Hive y determine el nombre de archivo de la DLL del problema en el marco Regedit de la derecha. mostrando debajo de " Predeterminado " . Si ese archivo reside en & Quot; C: \ Windows \ SysWow64 & Quot; (como C: \ Windows \ SysWow64 \ Redemption.dll & Quot;) entonces es importante que use " C: \ Windows \ SysWow64 \ RegSvr32.exe " archivo para registrar esa DLL desde la línea de comandos y NO el valor predeterminado " C: \ Windows \ System32 \ RegSvr32.exe " expediente. Así que ejecuté un indicador CMD (bajo control de nivel administrativo (en caso de que este nivel sea necesario) y escriba en la línea de comando (en el caso de mi DLL): C: \ Windows \ SysWow64 \ RegSvr32.exe c: \ Windows \ SysWow64 \ Redemption.dll presione la tecla Intro. Cierre la ventana de comandos (a través de & Quot; Salga & Quot; luego Reinicie su computadora (siempre use reiniciar en lugar de Cerrar y luego inicie, ya que (extrañamente) Reiniciar realice un apagado completo y volver a cargar todo, mientras que & "; Apagar &"; y Power-Up vuelve a cargar un caché almacenado de controladores y otros valores (que pueden estar defectuosos). Siempre que registre un archivo DLL en el futuro, recuerde usar SysWow64 & Quot; RegSvr32.exe & Quot; para cualquier DLL almacenada en la carpeta C: \ Windows \ SysWow64 y este problema c (si es causado por un registro incorrecto) no debería volver a ocurrir.

En mi caso, estoy produciendo archivos ms office como word o excel, Tengo Win+R y ejecutar dcomcnfg, en la configuración de DCOM, además de seleccionar la OFICINA relacionados con el elemento de nombre (tal como el nombre contiene Excel o Word o Office) y Open the properties, select Identity tab and select the interactive user. como esta respuesta,

Mi mensaje de error muestran CLSID {000209FF-0000-0000-C000-000000000046}, así que tengo que tratar de encontrar el CLSID específico en la configuración de DCOM, y lo hace exsits, y yo selecciónelo y siga el mismo paso de la interactive user, entonces funciona.

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