¿Cómo resolver la clase de excepción COM no registrada (excepción de HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))?

93

Cuando intento crear una instancia de una clase COM, arroja una excepción como

Clase no registrada (Excepción de HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))

Sugiera cómo podría solucionarlo.

Jaswant Agarwal
fuente
1
¿Puedes dar más detalles con algún código?
Xaisoft
10
Hay dos preguntas: 1. ¿Instaló / registró el componente COM en la máquina con Windows 7 x64? 2. ¿Cuál es la plataforma de destino de su aplicación, creo que debería configurar la plataforma en x86, por favor no la configure como "Cualquier CPU"? Primero registre el COM y luego ejecútelo para probar la aplicación, consulte el documento: support.microsoft.com/kb/146219 y Explicación del uso de Regsvr32 y mensajes de error
JackWang
Lo resolví sin cambiar el objetivo de compilación a 'x86'. Solución en el enlace: < stackoverflow.com/a/55513690/11310933 >
Sunil Xtha

Respuestas:

49

Parece que el programa o proceso que está intentando inicializar no está instalado en su máquina, tiene una instalación dañada o debe registrarse.

Puede instalarlo, repararlo (mediante Agregar o quitar programas) o registrarlo (mediante Regsvr32.exe).

No ha proporcionado suficiente información para que podamos ayudarlo más que esto.

Jay Riggs
fuente
4
Creo que se refería a RegSvr32.exe (en oposición a RegSrv32.exe).
windowsgm
60

Debe asegurarse de que todos sus ensamblados se compilen para la arquitectura correcta. Intente cambiar la arquitectura para x86 si reinstalar el componente COM no funciona.

Andy Fiedler
fuente
Esto resolvió mi proceso al no encontrar el cliente NAV 2009 R2 (ClassID 50000004-0000-1000-0001-0000836BD2D2).
Vincent Vancalbergh
14

Mi problema y la solucion

Tengo un dll de terceros de 32 bits que instalé en la máquina 2008 R2, que es de 64 bits.

Tengo un servicio wcf creado en .net 4.5 framework que llama a la dll de terceros de 32 bits para el proceso. Ahora tengo la propiedad de compilación configurada para apuntar a 'cualquier' CPU y la implementé en la máquina de 64 bits.

cuando intenté invocar el servicio wcf obtuve el error "80040154 Clase no registrada (Excepción de HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG"

Ahora utilicé ProcMon.exe para rastrear el problema del registro com e identifiqué que el proceso está buscando la entrada del registro en HKLM \ CLSID y HKCR \ CLSID donde no hay ninguna entrada.

Me enteré de que Microsoft no registrará los componentes com de 32 bits en las rutas HKLM \ CLSID, HKCR \ CLSID en una máquina de 64 bits, sino que coloca la entrada en las rutas HKLM \ Wow6432Node \ CLSID y HKCR \ Wow6432Node \ CLSID.

Ahora el conflicto es un proceso de 64 bits que intenta invocar un proceso de 32 bits en una máquina de 64 bits que buscará la entrada de registro en HKLM \ CLSID, HKCR \ CLSID. La solución es que tenemos que forzar el proceso de 64 bits para que mire la entrada del registro en HKLM \ Wow6432Node \ CLSID y HKCR \ Wow6432Node \ CLSID.

Esto se puede lograr configurando las propiedades del proyecto de servicio de wcf para apuntar a la máquina 'X86' en lugar de 'Cualquiera'.

Después de implementar la versión 'X86' en el servidor 2008 R2, apareció el problema "System.BadImageFormatException: No se pudo cargar el archivo o ensamblado"

La solución a esta excepción de formato de imagen incorrecta es configurar 'Enable32bitApplications' en 'True' en las propiedades de IIS Apppool para el grupo de aplicaciones correcto.

Waheed
fuente
No publique respuestas idénticas a varias preguntas. Publique una buena respuesta, luego vote / marque para cerrar las otras preguntas como duplicadas. Si la pregunta no es un duplicado, adapte sus respuestas a la pregunta .
Cleopatra
10

También tenga en cuenta que el contexto de la clase al inicializar puede crear esa excepción. Si tiene un objeto codificado como INPROC_SERVER pero intenta CoCreateInstance como CLSCTX_LOCAL_SERVER, también obtendrá ese error.

Debe asegurarse de que el objeto esté registrado y que CoCreateInstance esté creando una instancia con el contexto de clase correcto.

Andrew Keith
fuente
Sí, si, por ejemplo, intenta crear DesktopWallpaperusando CLSCTX_INPROC(en lugar de CLSCTX_ALL), obtendrá el 0x80040154 (REGDB_E_CLASSNOTREG)error.
user362515
9

Si está utilizando componentes COM de 64 bits en una aplicación web en IIS, asegúrese de que el grupo de aplicaciones esté configurado para no permitir aplicaciones de 32 bits ( Habilitar aplicaciones de 32 bits: falso en la configuración avanzada)

Matsen75
fuente
5

Lo hice funcionar habilitando aplicaciones de 32 bits en la configuración avanzada del grupo de aplicaciones. Haga clic con el botón derecho en el grupo de aplicaciones y elija la configuración avanzada: habilite las aplicaciones de 32 bits. Esto puede ayudar a alguien.

Yoky
fuente
Lo mismo para mi. Un dll de 32 bits utilizado en una máquina de desarrollo de 64 bits, una prueba de 64 bits y un servidor en vivo de 64 bits. Funcionó bien en la caja de desarrollo. Cuando se implementó en los servidores de prueba y en vivo, falló hasta que se permitieron aplicaciones de 32 bits en los respectivos grupos de aplicaciones de IIS y se reiniciaron los grupos. También tuve que desactivar "Incrustar tipos de interoperabilidad" (una configuración de la dll ofensiva en VS) y establecer "Copiar local" = verdadero para asegurarme de que la dll se haya copiado en su forma original en los servidores.
cymorg
3

Al registrar la clase (específicamente su CLSID), consulte, por ejemplo, aquí .

Alex Martelli
fuente
¿Podría ser también algún objeto que deba instalarse en su máquina o servidor, no necesariamente un registro de la clase?
Xaisoft
@Xaisoft, "instalación" normalmente implica "registro", como menciona la URL de MSDN que mencioné.
Alex Martelli
3

en mi caso

my platform es x64

the Dll library(sdk)y el redistributable packagees x64

entonces

  1. en el explorador de soluciones navigate to your project

  2. abierto Properties

  3. change the Platform target from AnyCPU to x64

ingrese la descripción de la imagen aquí

Basheer AL-MOMANI
fuente
2

La forma en que resolví este problema fue registrar la COMvía regsvr32.

asegúrese de que el COM que está invocando esté registrado.

Mi aplicación estaba usando xceedcry.dlly no la estaba registrando. Una vez que lo registré, la aplicación funcionó bien.

CesarB
fuente
2

Mi solución fue cambiar " Habilitar aplicaciones de 32 bits " a Verdadero en la configuración avanzada del grupo de aplicaciones relativas en IIS.

Grupo de aplicaciones

Habilitar aplicaciones de 32 bits

Adrian
fuente
2

En mi caso, la clase se registró correctamente y se construyó en CUALQUIER CPU / modo de 64 bits .

Pero la propiedad Habilitar aplicaciones de 32 bits del grupo de aplicaciones IIS de la aplicación que usa la clase se estableció en Verdadero .

No se encontró la clase debido a la discrepancia de arquitectura entre la configuración del grupo de aplicaciones y la clase registrada real.

Establecer Habilitar aplicaciones de 32 bits en Falso solucionó el problema. Configuración del grupo de aplicaciones IIS

Bhupinderjit Dhanoa
fuente
1

Para mí, tuve que crear una configuración de compilación de 64 bits.

jbooker
fuente
1

Tuve el mismo problema al usar MapWinGis. Encontré la solución, trabajando en el proyecto de formularios Windows Forms de Visual Studio 2015, simplemente haga clic derecho en el proyecto-> Propiedades-> Construir, establezca la configuración en Todas las configuraciones y en el cuadro de diálogo "Platform Target" configúrelo en x64.

Deydra A
fuente
0

Me encontré con este problema llamando a un ensamblado .Net desde un cliente C ++ a través de COM. Resulta que uno de los conjuntos de los que dependía el conjunto .Net no se pudo encontrar. Luché por un tiempo tratando de averiguar qué estaba mal con el primer ensamblaje, pero en realidad era una de las dependencias del primer ensamblado. Recibí dos errores diferentes al llamar a CoCreateInstance () desde el cliente C ++. El primero fue: REGDB_E_CLASSNOTREG Clase no registrada Y el segundo intento fue: 0x80131040: La definición del manifiesto del ensamblado ubicado no coincide con la referencia del ensamblado.

Así que verifique que las referencias de su ensamblaje estén presentes. Descubrí esto navegando por el primer ensamblado con dotPeek y notando que faltaba una de sus referencias. Colocar la versión correcta de la dependencia en la carpeta resolvió ambos errores.

Sean B
fuente
0

Estaba compilando mi aplicación dirigida a cualquier CPU y el problema principal resultó que adobe reader se instaló una versión anterior de 10.x necesita actualizar v11.x , esta es la forma en que puedo resolver este problema.

Anjan Kant
fuente
0

Me encontré con el mismo problema al usar una clase COM, es decir, 'Excepción de clase no registrada' en tiempo de ejecución. Para mí, pude resolver yendo al archivo app.config y cambiando los elementos 'inicio' y 'supportedRuntime' a algo como:

<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0"/>
  </startup>
</configuration>

Puede leer más sobre los detalles aquí http://stackoverflow.com/questions/1604663/

y aquí https://msdn.microsoft.com/en-us/library/w4atty68(v=vs.110).aspx

Debo tener en cuenta que estoy ejecutando Visual Studio 2017. Target cpu = x86 Embed Interop Type = true (en la ventana de propiedades)

Joseph Mawer
fuente
0

Vaya al directorio de .Net framework y registre su respectivo dll con la ruta de acceso al dll de espacio en blanco Regsvr32.exe .

Muhammad Saeed
fuente
0

Me he enfrentado al mismo problema. Después de investigar un poco, encontré una solución para mí y puede ser útil. El problema no solo está relacionado con la reinstalación, según mi observación, también depende de los permisos de acceso.

Paso 1: repare el objeto COM particular.

Paso 2: Servicios de componentes> Computadoras> Mi PC> Configuración DCOM> Seleccione su objeto COM> Haga clic con el botón derecho> Propiedades> pestaña Seguridad> Permisos de acceso> Elija Personalizar> Haga clic en EDITAR> Seleccione IIS_USER (si no existe, cree con derechos completos) y proporcione información completa acceder y haga clic en Aceptar.

Vaya a la pestaña Identidad> Puede seleccionar "Usuario interactivo" o "Este usuario"> Haga clic en Aplicar y Aceptar. Si elige "Este usuario", debemos otorgar un usuario privilegiado administrativo a ese servidor.

Paso 3: Abra el Administrador de IIS> Reinicie los grupos de aplicaciones.

Nota: Si es necesario, reinicie el servidor.

Pavan Kumar Vempati
fuente
-1

Aquí encuentre la solución, ejecute la herramienta mmc -32 (no dcomcfg)

En un sistema de 64 bits con Office de 32 bits, intente esto:

Start
Run
mmc -32
File
Add Remove Snap-in
Component Services
Add
OK
Console Root
Component Services
Computers
My Computer
DCOM Config
Microsoft Excel Application

ingrese la descripción de la imagen aquí

Martín Martínez
fuente