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 Windows Server 2008 64 bits, j’ai 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 en utilisant la commande regsvr32. J’ai pu voir ce CLSID dans le registre. Mais le problème persiste.
Quel pourrait être le problème?
Dans VS – propriétés du projet – dans l’onglet Build – cible de la plate-forme = X86
Il semblerait que votre service ait été construit sur «N’importe quel processeur», ce qui vous a causé 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, ce qui explique pourquoi il peut utiliser le composant. Construire votre solution contre x86
forcera votre service à fonctionner en 32 bits.
J’ai rencontré un problème très similaire.
Je devais 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 partie ont fonctionné à partir de tests unitaires dans Visual Studio, mais ont échoué à l’application Web hébergée dans IIS sur le même ordinateur avec l’erreur 80040154.
La modification du pool d’applications en “Activer les applications 32 bits” a résolu le problème.
Le problème est que le processus du serveur est 64 bits et que la bibliothèque est 32 bits et qu’il essaie de créer le composant COM dans le même processus (serveur in-proc). Vous pouvez soit recomstackr le serveur et le rendre 32 bits, soit laisser le serveur inchangé et rendre le composant COM hors processus. La méthode la plus simple pour rendre un serveur COM hors processus consiste à créer une application COM + – Panneau de configuration -> Outils d’administration -> ComponentServices.
Si vous cherchez un moyen de faire ce travail sans recomstackr votre application Any CPU, voici une autre solution possible:
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: http://www.gfi.com/blog/32bit-object-64bit-environment/
Vous n’avez pas besoin de configurer la cible X86 de votre plate-forme de propriétés de projet. Vous pouvez également configurer les options iis pour travailler avec x86 comme ça
La solution pour Windows 2008 Server x64 est la suivante:
Cette procédure est valide, ça va.
Avait un problème connexe avec un correctif différent, mais similaire:
Un projet de service Windows a été défini sur “Any-CPU” avec une DLL 64 bits. Même message d’erreur J’ai essayé plein de choses, mais rien n’a fonctionné. Enfin, je suis entré dans le projet Properties -> Build et j’ai remarqué que le projet “Prefer 32-bit” était coché. Désélectionné ceci et plus d’erreur.
Je suppose que le service Windows attendait une DLL 32 bits et ne pouvait pas le trouver.
Je n’ai modifié aucun paramètre de compilation.
Il suffit de définir “Activer l’application 32 bits = True” dans les parameters avancés d’AppPool.
Ça a fonctionné pour moi
J’avais le même problème, mais les autres réponses ne fournissaient qu’une partie de la solution.
La solution est double:
Retirez le 64bit du registre.
ou
Enregistrez-le en 32 bits:
C:\Windows\SysWOW64\regsvr32
L’enregistrer en tant que 32 bits sans supprimer l’enregistrement 64 bits ne résout pas mon problème.
Pour passer à x86:
Si vous exécutez un site Web, vous pouvez également essayer de configurer votre pool d’applications pour désactiver les applications 32 bits (sous les parameters avancés d’un pool).
Pour quiconque utilise VSTO, le problème pour moi était une référence manquante à l’assemblage de office
. Cela apparaîtrait également si vous essayiez d’instancier manuellement certains objects VSTO.
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 de développement (car le problème était survenu 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 en tant qu’OCX / COM pour l’application d’installation ou de mise à jour.
Cordialement
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 est partie et la vie est de nouveau bonne.