La récupération de la fabrique de classes COM pour le composant avec CLSID {XXXX} a échoué en raison de l'erreur suivante: 80040154

278

J'ai développé un service Windows en utilisant C # .NET pour générer un rapport PDF. Pour générer un fichier PDF, j'utilise une DLL tierce. L'application s'exécute sur ma plate-forme Windows XP. Lorsque j'ai déployé le service dans la version 64 bits de Windows Server 2008 , j'ai eu cette erreur:

La récupération de la fabrique de classes COM pour le composant avec CLSID {46521B1F-0A5B-4871-A4C2-FD5C9276F4C6} a échoué en raison de l'erreur suivante: 80040154.

J'ai enregistré la DLL à l'aide de la commande regsvr32. J'ai pu voir ce CLSID dans le registre. Mais le problème persiste.

Quel pourrait être le problème?

gopal
la source
1
Une application Web hébergée sur le même serveur est capable de générer un fichier PDF sans aucune erreur.
gopal
Les gars, j'ai essayé toutes les solutions possibles, mais j'obtiens toujours cette erreur. J'ai des assemblys et je les ai enregistrés avec succès mais j'obtiens toujours la même erreur. Vraiment besoin d'aide ...
newprogress

Réponses:

383

Dans VS - propriétés du projet - dans l'onglet Build - target target = X86

Fabrice MARIANADIN
la source
7
dans VS2008, j'ai trouvé cette option sous «Compiler-> Options de compilation avancées ...» (en bas de l'onglet de la fenêtre) puis «CPU cible» (x86)
Rodolfo
1
Vous méritez plus qu'un +1 mais +1 est tout ce que j'ai à donner
David
7
Ce n'est pas toujours la solution.
2
Vous m'avez sauvé sept comptes bancaires offshore, un stand de hot-dogs et mon mariage. Merci
Donald.Record
2
J'ai le même message d'erreur mais cette solution ne fonctionne pas pour moi.
Akram Khan
59

J'ai rencontré un problème très similaire.

J'avais besoin d'utiliser une ancienne DLL 32 bits dans une application Web en cours de développement sur une machine 64 bits. J'ai enregistré la DLL 32 bits dans le dossier windows \ sysWOW64 en utilisant la version de regsrv32 dans ce dossier.

Les appels à la DLL tierce ont fonctionné à partir de tests unitaires dans Visual Studio mais ont échoué à partir de l'application Web hébergée dans IIS sur la même machine avec l'erreur 80040154.

La modification du pool d'applications sur «Activer les applications 32 bits» a résolu le problème.

Daniel Ballinger
la source
1
C'est le moyen le plus simple que j'ai trouvé pour résoudre ce problème. Merci!
dexter
6
J'adore vraiment cette réponse. Il est inutile de compiler un site Web entier pour x86 lorsque vous n'appelez qu'une petite DLL 32 bits à un moment donné.
DanM7
@Daniel Ballinger Mon application s'exécuterait-elle en tant que processus 32 bits lors de la modification?
Novice
@Danny Je ne le crois pas, car il ne pourrait pas accéder à la DLL que j'ai enregistrée dans sysWOW64.
Daniel Ballinger
1
J'ai le même problème, mais je ne sais pas comment changer le pool d'applications, où dois-je faire, plz aidez-moi
Shima.Y
58

Il semble que votre service ait été construit contre «Any CPU», vous causant des erreurs sur 64 bits lorsque vous utilisez des composants COM. Vous devez le construire pour x86.

Le site Web fonctionne probablement comme un processus 32 bits, c'est pourquoi il peut utiliser le composant. La création de votre solution x86obligera votre service à s'exécuter en 32 bits.

stevehipwell
la source
Je suis également confronté au même problème..ici, mon application de bureau est installée avec succès sur un système 64 bits..pendant l'installation, j'ai réussi la synchronisation, mais quand je fais la synchronisation à partir de mon logiciel, cela me montre l'erreur ci-dessus
Mohini Mhetre
J'essaye de m'inscrire .ocx file (c:\Windows\SysWow>RegSvr32 genX.ocx)mais j'obtiens une erreur Le module n'a pas pu se charger. Assurez-vous que le binaire est stocké sur le chemin spécifié ou déboguez-le pour vérifier les problèmes avec le binaire ou les fichiers .DLL dépendants.
Naveen Kumar
Et s'il est compilé en 32 bits, alors le système regsvr32 doit être utilisé, pas la version SysWow64.
Fandango68
Je reçois cette erreur lors de l'exécution du package SSIS. Les connexions fonctionnent bien. Toutes les propriétés sont correctes. En fait, le package SSIS fonctionnait depuis de nombreux mois sans aucune erreur. Soudain, j'obtiens une erreur. J'ai essayé de changer le runtime / débogage en x86 à partir de x64, le problème n'a toujours pas été résolu.
IamVISH
16

Vous n'avez pas à configurer la cible de votre plateforme de propriétés de projet X86. Vous pouvez également configurer les options iis pour fonctionner avec x86 comme ça

  • Sélectionnez le pool d'applications
  • Sélectionnez le pool que votre application utilise
  • Réglages avancés
  • Activer les applications 32 bits true
nazim hatipoglu
la source
Cela a toujours été vrai pour moi. Jamais eu à définir la cible de la plate-forme sur X86 mais toujours • Activer les applications 32 bits = True • Définir l'identité = ApplicationPoolIdentity • Charger le profil utilisateur = True
Zath.
J'ai eu un problème similaire qui a été résolu selon les instructions de Nazim, mais je n'ai pas non plus dû "incorporer les types d'interopérabilité" (une propriété de la DLL référencée) et définir Copy Local = true.
cymorg
Comment "sélectionnez-vous le pool d'applications"?
CodyBugstein
Le menu Pools d'applications est dans la liste du menu iis à gauche
nazim hatipoglu
16

Si vous cherchez un moyen de faire fonctionner cela sans recompiler votre application Any CPU, voici une autre solution de contournement potentielle:

  1. Recherchez votre GUID d'objet COM sous HKey_Classes_Root \ Wow6432Node \ CLSID \ {GUID}
  2. Une fois localisé, ajoutez une nouvelle valeur REG_SZ (chaîne). Le nom doit être AppID et les données doivent être le même GUID d'objet COM que vous venez de rechercher
  3. Ajoutez une nouvelle clé sous HKey_Classes_Root \ Wow6432Node \ AppID. La nouvelle clé doit être appelée de la même manière que le GUID de l'objet COM.
  4. Sous la nouvelle clé que vous venez d'ajouter, ajoutez une nouvelle valeur de chaîne et appelez-la DllSurrogate. Laissez la valeur vide.
  5. Créez une nouvelle clé sous HKey_Local_Machine \ Software \ Classes \ AppID \ Encore une fois, la nouvelle clé doit être appelée de la même manière que le GUID de l'objet COM. Aucune valeur n'est nécessaire pour être ajoutée sous cette clé.

Je ne prends aucun crédit pour la solution, mais cela a fonctionné pour nous. Consultez le lien source pour plus d'informations et d'autres commentaires.

Source: https://techtalk.gfi.com/32bit-object-64bit-environment/

Joshua Starner
la source
1
Excellentes instructions. J'utilisais un outil tiers, me laissant incapable de changer la plate-forme de construction. Cette solution a contourné ce problème. Je vous remercie!
J'ai trouvé la clé comme vous l'avez décrit à l'étape 1, puis je savais quel objet COM est à l'origine des problèmes, puis je lance simplement regsvr32 dessus. Merci beaucoup!
MichaelS
Lorsque j'ai fait cela, mon serveur Web local (IIS) a commencé à se voir refuser l'accès. Cela me dit que c'était un pas dans la bonne direction, mais je ne sais pas à qui donner accès à ce stade. stackoverflow.com/questions/14019401/…
user420667
14

Le problème est que le processus serveur est 64 bits et la bibliothèque est 32 bits et il essaie de créer le composant COM dans le même processus (serveur in-proc). Soit vous recompilez le serveur et le rendez 32 bits, soit vous laissez le serveur inchangé et vous désactivez le composant COM. La façon la plus simple de rendre un serveur COM hors processus consiste à créer une application COM + - Panneau de configuration -> Outils d'administration -> ComponentServices.

acéré
la source
J'ai rencontré une erreur lors de la tentative de création d'une application COM +. An error occurred while processing the last operation. [Error code 00690075] The event log may contain additional troubleshooting information.
KZee
8

Je n'ai modifié aucun paramètre de compilation.

Définissez simplement "Activer l'application 32 bits = True" dans les paramètres avancés d'AppPool.

Ça a marché pour moi

Eduardo Xavier
la source
1
Où sont les paramètres avancés d'AppPool?
CodyBugstein
7

La solution pour Windows 2008 Server x64 est:

  1. ouvrez cmd.exe avec l'autorisation d'administrateur.
  2. Copiez la DLL dans le dossier C: \ Windows \ SysWOW64
  3. exécutez regsvr32 à partir de C: \ Windows \ SysWOW64
  4. Vérifiez que la DLL est dans le registre de Windows.
  5. Si vous avez un x86 .exe qui utilise la DLL, l'exe doit être compilé en mode x86.
  6. L'exe doit être installé dans le dossier C: \ Program Files (x86)

Cette procédure est valide, elle est correcte.

Juan
la source
6

J'ai eu le même problème, mais les autres réponses n'ont fourni qu'une partie de la solution.

La solution est double:

Retirez le 64 bits du registre.

  • c: \ windows \ system32 \ regsvr32.exe / U
  • Cela ne supprimera pas les références à d'autres copiés de la DLL dans d'autres dossiers.

ou

  • Recherchez la clé appelée HKEY_CLASSES_ROOT \ CLSID {......} \ InprocServer32. Cette clé aura le nom de fichier de la DLL comme valeur par défaut.
  • J'ai supprimé le dossier HKEY_CLASSES_ROOT \ CLSID {......}.

Enregistrez-le en 32 bits:

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

L'enregistrer en 32 bits sans supprimer l'enregistrement 64 bits ne résout pas mon problème.

Gerhard Powell
la source
Bingo! C'est la réponse que je cherchais (voir mes commentaires ailleurs). Merci!
Fandango68
5

Eu un problème connexe avec un correctif différent, mais similaire:

J'avais un projet de service Windows défini sur "Any-CPU" à l'aide d'une DLL 64 bits. Même message d'erreur. J'ai essayé tout un tas de choses, mais rien n'a fonctionné. Enfin, je suis entré dans Propriétés du projet -> Créer et j'ai remarqué que le projet avait coché "Préférer 32 bits". Décoché cela et plus d'erreur.

Je suppose que le service Windows attendait une DLL 32 bits et ne l'a pas trouvée.

jinushaun
la source
Bien que ce soit étrange mais ça marche !! Merci
FindOutIslamNow
3

Pour passer à x86:

  1. Créez un projet de configuration pour votre solution.
  2. Après l'avoir créé, accédez à l'Explorateur de solutions, cliquez avec le bouton droit sur le projet d'installation.
    • Appuyez sur Configuration Manager.
    • Cliquez sur: combobox "Active Solution Platform" et sélectionnez Nouveau (S'il n'y a pas de x86 affiché)
    • Sélectionnez dans le premier combo x86 puis appuyez sur OK.
    • reconstruisez le projet d'installation, puis reconstruisez tout le projet.
ShouShouLeb
la source
3

Si vous exécutez un site Web, vous pouvez également essayer de définir votre pool d'applications pour désactiver les applications 32 bits (dans les paramètres avancés d'un pool).

scramblor
la source
2
J'ai eu l'opposé et j'ai dû activer les applications 32 bits.
row1
2

Dans mon cas personnel, le problème a été résolu en recherchant l'ID de classe dans le registre de Windows sur la machine du développeur (car le problème a été jeté sur un PC client). Cette action sera placée dans le composant COM à l'origine du problème: une bibliothèque x86 référencée dans mon projet .NET qui n'était pas enregistrée comme OCX / COM pour le programme d'installation ou la mise à jour.

Cordialement

César Qüeb
la source
1

Pour toute personne utilisant VSTO, le problème pour moi était une référence manquante à l' officeassemblage. Il apparaît également si vous essayez d'instancier manuellement certains objets VSTO.

Alex
la source
1

J'ai constaté que mon problème était lié à l'enregistrement réel de la DLL.

Exécutez d'abord "Regedit.exe" à partir d'une invite CMD (j'ai élevé son niveau de sécurité à Administrateur, "juste au cas où") puis recherchez dans le Registre (en cliquant sur "Modifier / Rechercher" dans le menu RegEdit ou en appuyant sur Ctrl + F) pour le CLSID affiché dans le message d'erreur que vous avez reçu concernant l'usine de classe COM. Mon CLSID était 29AB7A12-B531-450E-8F7A-EA94C2F3C05F. Lorsque cette clé est trouvée, sélectionnez la sous-clé "InProcServer2" sous ce nœud Hive et vérifiez le nom de fichier de la DLL problématique dans le cadre Regedit de droite. affiché sous "Par défaut". Si ce fichier réside dans "C: \ Windows \ SysWow64" (tel que C: \ Windows \ SysWow64 \ Redemption.dll "), il est important que vous utilisiez le fichier" C: \ Windows \ SysWow64 \ RegSvr32.exe "pour enregistrez cette DLL à partir de la ligne de commande et NON la valeur par défaut "C: C: \ Windows \ SysWow64 \ RegSvr32.exe c: \ Windows \ SysWow64 \ Redemption.dll, appuyez sur Entrée. Fermez la fenêtre de commande (via "Quitter" puis redémarrez votre ordinateur (utilisez toujours le redémarrage au lieu de Fermer puis redémarrez, car (étrangement) Le redémarrage effectue un arrêt et un rechargement approfondis de tout tandis que "Arrêter" et Power-Up rechargent un cache stocké des pilotes et autres valeurs (qui peuvent être défectueux). Chaque fois que vous enregistrez une DLL à l'avenir, n'oubliez pas d'utiliser le SysWow64 "RegSvr32.exe" pour toute DLL stockée dans le dossier C: \ Windows \ SysWow64 et ce problème c (si elle est causée par un enregistrement incorrect) ne devrait pas se reproduire.

Chris Raisin
la source
Excellente astuce, mais sachez simplement qu'en enregistrant une DLL 32 bits dans SysWow64, il est supposé que la DLL a un wrapper pour gérer les requêtes 64 bits.
Fandango68
0

Mon problème était que j'avais la mauvaise version de MS Sync FrameWork (1.0) dans mes références de projet. Après la mise à jour vers la version 2.1, l'erreur a disparu et la vie est à nouveau bonne.

Phogrammer
la source
0

Dans mon cas, je produis un fichier MS Office comme wordou excel, je lance Win+Ret exécute dcomcnfg, dans la configuration DCOM, en plus de sélectionner l'élément de nom lié au bureau (tel que le nom contient Excelou Wordou ou Office) et Open the properties, select Identity tab and select the interactive user.comme cette réponse ,

Mon message d'erreur s'affiche CLSID {000209FF-0000-0000-C000-000000000046}, donc je dois essayer de trouver ce CLSID spécifique dans DCOM Config, et il se termine, je le sélectionne et je suis la même étape que le interactive user, puis cela fonctionne.

yu yang Jian
la source