web-dev-qa-db-fra.com

Classe non enregistrée Erreur

L'exécution d'une application à partir de Visual Studio 2012 sur des ordinateurs 64 bits affiche le message d'erreur suivant: 

La récupération de la fabrique de classes COM pour le composant avec CLSID {F2D4F4E5-EEA1-46FF-A83B-A270C92DAE4B} a échoué en raison de l'erreur suivante: 80040154 Classe non enregistrée (exception de HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))

J'utilise la bibliothèque packandgo dll Inventor dans Visualstudio.

Quelqu'un sait quelle est l'erreur?

11
Arun

Mon problème et la solution

  1. J'ai un dll tiers 32 bits que j'ai installé en 2008 R2 machine qui est 64 bits.

  2. J'ai un service de wcf créé dans le cadre de .net 4.5 qui appelle la DLL tierce de 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ée sur la machine 64 bits. 

  3. Lorsque Ii a tenté d'appeler le service wcf, l'erreur "80040154 Classe non enregistrée (exception de HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG")

  4. Maintenant, Ii a utilisé ProcMon.exe pour suivre le problème du registre com et a identifié que le processus recherche l'entrée de registre sous HKLM\CLSID et HKCR\CLSID où il n'y a aucune entrée.

  5. Sachez que Microsoft n'enregistrera pas les composants com 32 bits dans les chemins HKLM\CLSID, HKCR\CLSID dans une machine 64 bits, mais placera l'entrée dans les chemins HKLM\Wow6432Node\CLSID et HKCR\Wow6432Node\CLSID.

  6. Désormais, le conflit est un processus 64 bits qui tente d’appeler un processus 32 bits sur un ordinateur 64 bits qui recherche l’entrée de registre dans HKLM\CLSID, HKCR\CLSID. La solution est de forcer le processus 64 bits à examiner l'entrée de registre sous HKLM\Wow6432Node\CLSID et HKCR\Wow6432Node\CLSID.

  7. Cela peut être réalisé en configurant les propriétés du projet de service wcf pour qu'elles ciblent la machine 'X86' au lieu de 'N'importe lequel'.

  8. 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".

  9. Solution à cette badimageformatexception définit 'Enable32bitApplications' sur 'True' dans les propriétés IIS Apppool pour le bon pool.

24
Waheed

Le problème est que la DLL est enregistrée sur la version 32 bits du registre Windows et que l'application utilise la version 64 bits.

Solution: Allez dans l'onglet Propriétés du projet, Compiler et cliquez sur "Options de compilation avancées ...". Changez "CPU cible" en x86, cliquez sur OK, enregistrez et réessayez.

Source: http://www.theogray.com/blog/2009/10/comexception-regdbeclassnotreg-on-64-bit-windows

A travaillé pour moi avec un VB 6 COM DLL appelé à partir d'une application .Net 4 Winforms

5
Mariano Quevedo

Quelque part dans le code que vous utilisez, il existe un appel à l'API Win32, CoCreateInstance , pour charger de manière dynamique un DLL et en instancier un objet.

Le mappage entre l'ID de composant et la DLL capable d'instancier cet objet se trouve généralement dans HEKY_CLASSES_ROOT\CLSID dans le registre. En discuter davantage, ce serait beaucoup expliquer sur COM sous Windows . Mais l'erreur indique que le GUID COM n'est pas présent dans le Registre.

Je ne fais pas grand-chose sur ce qu'est PackAndGo DLL (un composant Autodesk), mais je suppose que vous devez simplement "installer" ce composant ou le package logiciel fourni avec le programme d'installation désigné pour obtenir ce fichier DLL et les clés de registre COM appropriées sur votre ordinateur sur lequel vous essayez d'exécuter votre code. (c'est-à-dire, exécutez setup.exe pour ce produit).

En d'autres termes, je pense que vous devez installer "Pack and Go" sur cet ordinateur au lieu de simplement copier le fichier DLL sur l'ordinateur cible.

Assurez-vous également que vous décidez de créer votre code en tant que 32 bits par rapport à 64 bits, en fonction de la version de compilation (32 ou 64 bits) de Pack And Go que vous installez.

4
selbie

Dans les machines Windows 64 bits, les composants COM doivent s'enregistrer dans HKEY_CLASSES_ROOT\CLSID (composant 64 bits) OR HKEY_CLASSES_ROOT\Wow6432Node\CLSID (composant 32 bits). Si votre application est une application 32 bits s'exécutant sur une machine 64 bits, la bibliothèque COM recherche généralement le GUID sous le noeud Wow64 et si votre application est une application 64 bits, la bibliothèque COM essaiera de se charger à partir de HKEY_CLASSES_ROOT\CLSID. Assurez-vous que vous ciblez la bonne plateforme et que vous avez installé la version correcte de la bibliothèque (32/64 bits).

1
Rajesh

Longtemps résolu, j'en suis sûr, mais cela pourrait aider une autre âme pauvre.

Cette erreur peut se produire si la DLL que vous déployez dans le package d'installation n'est pas la même chose que la DLL que vous référencez (elles auront des ID différents)

Cela semble évident, mais peut facilement arriver si vous apportez une petite modification à la DLL et que vous avez déjà installé l'application sur votre propre machine qui réenregistre la dll. 

1
apc

Je recevais l'erreur ci-dessous dans mon application 32 bits. 

Erreur: récupération de la fabrique de classe COM pour le composant avec CLSID {4911BB26-11EE-4182-B66C-64DF2FA6502D} a échoué pour les raisons suivantes erreur: 80040154 Classe non enregistrée (exception de HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

Et sur la définition de "Enable32bitApplications" sur true dans defaultapplicationpool dans IIS a fonctionné pour moi.

0
Deeku

J'ai eu ce problème et je l'ai résolu quand j'ai compris qu'il cherchait le registre Windows spécifié entre parenthèses.

Comme l'erreur ne se produisait que sur un seul ordinateur, je devais exporter le registre de l'ordinateur sur lequel il fonctionnait et l'installer sur l'ordinateur sur lequel il manquait.

0
André Santaló