Comment résoudre la classe d'exception COM non enregistrée (exception de HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))?

93

Lorsque j'essaye de créer une instance d'une classe COM, cela lève une exception comme

Classe non enregistrée (exception de HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))

Veuillez suggérer comment pourrais-je le résoudre?

Jaswant Agarwal
la source
1
Pouvez-vous donner plus de détails avec du code?
Xaisoft
10
Il y a deux questions: 1. Avez-vous installé / enregistré le composant COM sur la machine Windows 7 x64? 2. Quelle est la plate-forme cible de votre application, je pense que vous devriez définir la plate-forme sur x86, veuillez ne pas la définir comme "Any CPU"? Veuillez d'abord enregistrer le COM, puis exécuter pour tester l'application, veuillez vous référer au document: support.microsoft.com/kb/146219 et Explication de l'utilisation de Regsvr32 et des messages d'erreur
JackWang
Je l'ai résolu sans changer la cible de construction en «x86». Solution dans le lien: < stackoverflow.com/a/55513690/11310933 >
Sunil Xtha

Réponses:

49

Il semble que le programme ou le processus que vous essayez d'initialiser n'est pas installé sur votre ordinateur, a une installation endommagée ou doit être enregistré.

Installez-le, réparez-le (via Ajout / Suppression de programmes) ou enregistrez-le (via Regsvr32.exe).

Vous ne nous avez pas fourni suffisamment d'informations pour vous aider plus que cela.

Jay Riggs
la source
4
Je pense que vous vouliez dire RegSvr32.exe (par opposition à RegSrv32.exe).
windowsgm
60

Vous devez vous assurer que tous vos assemblys sont compilés pour la bonne architecture. Essayez de changer l'architecture pour x86 si la réinstallation du composant COM ne fonctionne pas.

Andy Fiedler
la source
Cela a résolu mon processus ne trouvant pas le client NAV 2009 R2 (ClassID 50000004-0000-1000-0001-0000836BD2D2).
Vincent Vancalbergh
14

Mon problème et la solution

J'ai une dll tierce 32 bits que j'ai installée dans la machine 2008 R2 qui est 64 bits.

J'ai un service wcf créé dans le cadre .net 4.5 qui appelle la dll tierce 32 bits pour le processus. Maintenant, j'ai défini la propriété de construction pour cibler «n'importe quel» processeur et je l'ai déployé sur la machine 64 bits.

lorsque j'ai essayé d'appeler le service wcf, j'ai obtenu l'erreur "80040154 Classe non enregistrée (Exception de HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG"

Maintenant, j'ai utilisé ProcMon.exe pour tracer le problème de registre com et identifié que le processus recherche l'entrée de registre à HKLM \ CLSID et HKCR \ CLSID où il n'y a pas d'entrée.

Je suis venu pour savoir que Microsoft n'enregistrera pas les composants com 32 bits dans les chemins HKLM \ CLSID, HKCR \ CLSID dans la machine 64 bits plutôt qu'il place l'entrée dans les chemins HKLM \ Wow6432Node \ CLSID et HKCR \ Wow6432Node \ CLSID.

Maintenant, le conflit est un processus 64 bits essayant d'appeler un processus 32 bits dans une machine 64 bits qui recherchera l'entrée de registre dans HKLM \ CLSID, HKCR \ CLSID. La solution est que nous devons forcer le processus 64 bits à regarder l'entrée de registre dans HKLM \ Wow6432Node \ CLSID et HKCR \ Wow6432Node \ CLSID.

Ceci peut être réalisé en configurant les propriétés du projet de service wcf pour cibler la machine «X86» au lieu de «Tout».

Après le déploiement de la version 'X86' sur le serveur 2008 R2, le problème "System.BadImageFormatException: impossible de charger le fichier ou l'assembly"

La solution à cette mauvaiseimageformatexception consiste à définir «Enable32bitApplications» sur «True» dans les propriétés IIS Apppool pour le pool d'applications approprié.

Waheed
la source
Veuillez ne pas publier de réponses identiques à plusieurs questions. Publiez une bonne réponse, puis votez / marquez pour fermer les autres questions comme des doublons. Si la question n'est pas un doublon, adaptez vos réponses à la question .
kleopatra
10

Notez également que le contexte de classe lors de l'initialisation peut créer cette exception. Si vous avez un objet qui est codé comme INPROC_SERVER mais que vous essayez de CoCreateInstance comme CLSCTX_LOCAL_SERVER, vous obtiendrez également cette erreur.

Vous devez vous assurer que l'objet est enregistré et que CoCreateInstance crée une instance avec le contexte de classe correct.

Andrew Keith
la source
Oui, si par exemple vous essayez de créer en DesktopWallpaperutilisant CLSCTX_INPROC(au lieu de CLSCTX_ALL) vous obtiendrez l' 0x80040154 (REGDB_E_CLASSNOTREG)erreur.
user362515
9

Si vous utilisez des composants COM 64 bits dans une application Web sur IIS, assurez-vous que le pool d'applications est configuré pour ne pas autoriser les applications 32 bits ( Activer les applications 32 bits: faux dans les paramètres avancés)

Matsen75
la source
5

Je l'ai fait fonctionner en activant les applications 32 bits dans les paramètres avancés du pool d'applications. Cliquez avec le bouton droit sur le pool d'applications et choisissez les paramètres avancés - activez les applications 32 bits. Cela peut aider quelqu'un là-bas.

Yoky
la source
Pareil pour moi. Une dll 32 bits utilisée sur une machine de développement 64 bits, un test 64 bits et un serveur live 64 bits. A bien fonctionné sur la boîte de développement. Lors du déploiement sur les serveurs de test et en direct, il a échoué jusqu'à ce que les applications 32 bits soient autorisées dans les pools d'applications IIS respectifs et que les pools aient redémarré. J'ai également dû désactiver "Embed Interop Types" (un paramètre sur la DLL incriminée dans VS) et définir "Copy Local" = true pour m'assurer que la DLL était effectivement copiée dans sa forme originale sur les serveurs.
cymorg
3

En enregistrant la classe (en particulier son CLSID) - voir par exemple ici .

Alex Martelli
la source
Serait-ce aussi un objet qui doit être installé sur sa machine ou son serveur, pas nécessairement un enregistrement de la classe.
Xaisoft
@Xaisoft, "installation" implique typiquement "enregistrement", comme le mentionne l'url MSDN que j'ai pointé.
Alex Martelli
3

dans mon cas

my platform est x64

the Dll library(sdk) et le redistributable package est x64

alors

  1. dans l'explorateur de solutions navigate to your project

  2. ouvert Properties

  3. change the Platform target from AnyCPU to x64

entrez la description de l'image ici

Basheer AL-MOMANI
la source
2

La façon dont j'ai résolu ce problème était d'enregistrer le COMviaregsvr32 .

assurez-vous que le COM que vous appelez est enregistré.

Mon application l'utilisait xceedcry.dllet je ne l'enregistrais pas. Une fois que je l'ai enregistré, l'application a bien fonctionné.

CesarB
la source
2

Ma solution a été de changer le " Activer les applications 32 bits " sur True dans les paramètres avancés du pool d'applications relatif dans IIS.

Pool d'applications

Activer les applications 32 bits

Adrian
la source
2

Dans mon cas, la classe a été correctement enregistrée et intégrée à N'IMPORTE QUEL CPU / 64 bits .

Mais la propriété Activer les applications 32 bits du pool d'applications IIS de l'application qui utilise la classe a été définie sur True .

La classe n'a pas été trouvée en raison de l'incompatibilité d'architecture entre la configuration du pool d'applications et la classe enregistrée réelle.

Définir Activer les applications 32 bits sur False a résolu le problème. Paramètres du pool d'applications IIS

Bhupinderjit Dhanoa
la source
1

Pour moi, j'ai dû créer une configuration de construction 64 bits.

jbooker
la source
1

J'ai eu le même problème avec MapWinGis. J'ai trouvé la solution, en travaillant sur le projet de formulaires Windows de Visual Studio 2015, il suffit de faire un clic droit sur le projet-> propriétés-> Construire, définir la configuration sur Toutes les configurations et dans la conbobox "cible de la plate-forme", réglez-la sur x64.

Deydra A
la source
0

J'ai rencontré ce problème en appelant un assembly .Net à partir d'un client C ++ via COM. Il s'avère que l'un des assemblys dont dépendait l'assembly .Net est introuvable. J'ai lutté pendant un moment pour essayer de comprendre ce qui n'allait pas avec la 1ère assemblée, mais c'était en fait l'une des dépendances de la 1ère assemblée. J'ai reçu deux erreurs différentes lors de l'appel de CoCreateInstance () à partir du client C ++. Le premier était: REGDB_E_CLASSNOTREG Classe non enregistrée Et le deuxième essai était: 0x80131040: La définition de manifeste de l'assembly localisé ne correspond pas à la référence d'assembly.

Vérifiez donc que les références de votre assemblage sont présentes. J'ai découvert cela en parcourant le 1er assemblage avec dotPeek et en remarquant qu'une de ses références manquait. Le placement de la version correcte de la dépendance dans le dossier a résolu les deux erreurs.

Sean B
la source
0

Je compilais mon application ciblant n'importe quel processeur et le problème principal s'est avéré que Adobe Reader a été installé.L'ancien v10.x a besoin de mettre à niveau v11.x , c'est ainsi que j'arrive à résoudre ce problème.

Anjan Kant
la source
0

J'ai rencontré le même problème en utilisant une classe COM, c'est-à-dire «exception de classe non enregistrée» au moment de l'exécution. Pour moi, j'ai pu résoudre en accédant au fichier app.config et en changeant les éléments 'startup' et 'supportedRuntime' en quelque chose comme:

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

Vous pouvez en savoir plus sur les détails ici http://stackoverflow.com/questions/1604663/

et ici https://msdn.microsoft.com/en-us/library/w4atty68(v=vs.110).aspx

Je dois noter que j'exécute Visual Studio 2017. Cible cpu = x86 Embed Interop Type = true (dans la fenêtre des propriétés)

Joseph Mawer
la source
0

allez dans le répertoire de .Net Framework et enregistrez leur DLL respective avec le chemin de la DLL d'espace blanc Regsvr32.exe .

Muhammad Saeed
la source
0

J'ai été confronté au même problème. Après avoir fait quelques recherches, j'ai trouvé un correctif pour moi et cela peut être utile. Le problème n'est pas seulement lié à la réinstallation de mon observation, il dépend également des autorisations d'accès.

Étape 1: Réparez l'objet COM particulier.

Étape 2: Services de composants> Ordinateurs> Poste de travail> DCOM Config> Sélectionnez votre objet COM> Clic droit> Propriétés> onglet Sécurité> Autorisations d'accès> Choisissez Personnaliser> Cliquez sur MODIFIER> Sélectionnez IIS_USER (s'il n'existe pas, créez avec des droits complets) et donnez complet accédez et cliquez sur OK.

Passer à l'onglet Identité> Vous pouvez sélectionner "Utilisateur interactif" ou "Cet utilisateur"> Cliquez sur Appliquer et OK. Si vous choisissez "Cet utilisateur", nous devons donner un utilisateur privilégié Administrateur à ce serveur

Étape 3: Ouvrez le Gestionnaire IIS> Redémarrez les pools d'applications.

Remarque: si nécessaire, veuillez redémarrer le serveur

Pavan Kumar Vempati
la source
-1

Trouvez ici la solution, exécutez l'outil mmc -32 (pas dcomcfg)

Sur un système 64 bits avec Office 32 bits, essayez ceci:

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

entrez la description de l'image ici

Martín Martínez
la source