.net windows-services com-interop 32bit-64bit

.net - Error al recuperar la fábrica de clases COM para el componente con CLSID{XXXX} debido al siguiente error: 80040154



windows-services com-interop (15)

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

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

Error al recuperar la fábrica de clases COM para el componente con CLSID {46521B1F-0A5B-4871-A4C2-FD5C9276F4C6} debido al siguiente error: 80040154.

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

¿Cual podría ser el problema?


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


En mi caso personal, el problema se solucionó buscando el ID de clase en el Registro de Windows en la máquina del desarrollador (porque el problema se había lanzado en una PC cliente). Esta acción se colocará en el componente COM que causa el problema: una biblioteca x86 a la que se hace referencia en mi proyecto .NET que no estaba siendo registrada como OCX / COM para la aplicación del instalador o del actualizador.

Saludos


La solución para Windows 2008 Server x64 es:

  1. abrir cmd.exe con permiso de administrador.
  2. Copie la dll a la carpeta C: / Windows / SysWOW64
  3. ejecute regsvr32 desde C: / Windows / SysWOW64
  4. Verificar que dll está en el registro de Windows.
  5. Si tiene un archivo .exe x86 que usa la DLL, el archivo ejecutable debe compilarse en modo x86.
  6. El archivo ejecutable debe instalarse en la carpeta C: / Archivos de programa (x86)

Este procedimiento es válido, está bien.


Me encontré con un problema muy similar.

Necesitaba usar una DLL antigua de 32 bits en 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 de unidad 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.


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 vuelve a ser buena.


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


No tiene que configurar su plataforma de propiedades de proyecto objetivo X86. También puede configurar las opciones de iis para trabajar con x86 de esa manera

  • Seleccionar grupo de aplicaciones
  • Seleccione el grupo que utiliza su aplicación
  • Ajustes avanzados
  • Habilitar aplicaciones de 32 bits verdaderas

Para cambiar a x86:

  1. Cree un proyecto de instalación para su solución.
  2. Después de crearlo, vaya al Explorador de soluciones, haga clic derecho en el proyecto de instalación.
    • Presione el administrador de configuración.
    • Haga clic en el cuadro combinado "Active Solution Platform" 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.

Para cualquier persona que use VSTO, el problema para mí era la falta de una referencia al ensamblaje de la office . También aparecería si estuviera intentando crear una instancia de ciertos objetos VSTO manualmente.


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

  1. Localice el GUID de su objeto COM bajo HKey_Classes_Root / Wow6432Node / CLSID / {GUID}
  2. Una vez localizado, agregue un nuevo valor REG_SZ (cadena). El nombre debe ser AppID y los datos deben ser el mismo GUID del 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. No es necesario agregar valores bajo esta clave.

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

Fuente: http://www.gfi.com/blog/32bit-object-64bit-environment/


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


Tenía un problema relacionado con una solución diferente, pero similar:

Tenía un proyecto de servicio de Windows configurado en "Cualquier CPU" utilizando una DLL de 64 bits. Mismo mensaje de error. Probé un montón de cosas, pero nada funcionó. Finalmente, entré en las Propiedades del proyecto -> Construir y noté que el proyecto tenía "Preferido 32 bits" marcado. Desmarque 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:

Retire los 64 bits del Registro.

  • 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 {......}.

Registrarlo como 32bit:

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

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


Parece que su servicio fue creado contra ''Cualquier CPU'', causando errores en 64 bits en los que está utilizando componentes COM. Necesitas construirlo para x86 .

El sitio web probablemente se ejecuta como un proceso de 32 bits, por lo que puede usar el componente. Construir su solución contra x86 forzará su servicio para ejecutarse como de 32 bits.