2009-06-09 9 views
3

J'ai une application C# utilisant un objet COM C++ construit sur une machine 32 bits. Maintenant, je dois les exécuter sur une machine 64 bits. J'ai enregistré l'objet COM. Une entrée correspondante a été créée dans le registre sous l'ordinateur \ hkey_classes_root \ wow6432node \ clsid {xxx}. Toutefois, lorsque j'essaie d'exécuter l'application, il est indiqué que | "La récupération de la fabrique de classe COM pour le composant avec CLSID {xxx} a échoué en raison de l'erreur suivante: 80040154.". Si je comprends bien, le code d'erreur signifie que la classe n'est pas enregistrée. S'il vous plaît, aidez !!! MerciExécution de l'application 32 bits à l'aide de com 32 bits sur une machine Windows 64 bits

Répondre

4

La première réponse est au-dessus de la bonne réponse. Vous ne pouvez pas exécuter une application cible CPU ANY sur Windows 64 bits si vous faites référence à un composant COM 32 bits. Ça ne va pas charger.

Qu'est-ce qui se passe, c'est que le JIT voit UC CPU et la promotion de votre application en 64 bits. Mais il n'y a pas de version 64 bits du contrôle com et donc vous obtenez l'erreur non enregistrée.

Ceci est un gros problème pour les personnes qui utilisent Microsoft Access pour leur base de données. Il n'y a pas de version 64 bits d'Access, donc quand ils voient l'erreur, ils pensent qu'ils ont besoin d'une exécution 64 bits (n'existe pas). Vous devez marquer votre application en tant que 32 bits uniquement afin d'utiliser le runtime Access.

Ceci est un mauvais choix (IMHO) - trouver un meilleur composant qui a une version 64 bits, ou aller 100% du code managé.

Je n'aime pas toutes les applications tag comme 32 bits seulement, sauf si elles en ont vraiment besoin.

+0

Tout d'abord, merci beaucoup! J'ai reconstruit l'application en tant que x86 et elle a trouvé l'objet com. Maintenant, je me demande si je devrais reconstruire toutes les bibliothèques dont il dépend en tant que x86 aussi. Est-il suffisant de ne construire que l'application en configuration x86 ou toutes ses dépendances devraient être construites en tant que x86 aussi? Merci encore! –

+1

En général, le domaine d'application (application principale) qui s'exécute dictera la taille de l'application. Si votre application principale est x86, le JIT ne promouvra normalement rien sous 64 bits. Mais cela peut dépendre de la manière dont vous le chargez. Pour être sûr, vous voudrez peut-être marquer tous les x86. –

2

L'application C# peut avoir été compilée avec la cible Any CPU, qui fonctionnera comme en mode 64 bits sur une machine x64. Les processus 64 bits ne peuvent pas accéder aux processus 32 bits.

Dans Visual Studio, vous pouvez forcer la compilation en tant qu'application 32 bits uniquement. C'est dans les propriétés du projet, onglet Construire, liste déroulante cible de la plate-forme. Réglez-le sur x86.

Il peut y avoir d'autres façons de l'exécuter en tant qu'application 32 bits, mais je ne les connais pas.

0

Je ne pense pas que vous pouvez exécuter une application 32 bits nativement sur une machine 64 bits. Vous devez compiler votre application en tant que binaire 64 bits ou l'exécuter sous un émulateur (comme WOW64 sur Windows). Si votre application (intégrée au binaire 64 bits) utilise des DLL externes, vous avez également besoin de la version 64 bits de toutes ces DLL.

est ici une bonne référence:

http://searchwindowsserver.techtarget.com/tip/0,289483,sid68_gci1220022,00.html

Edit:

Si vous allez à votre Propriétés du projet -> Construire, changer la cible de la plate-forme de "Any CPU" à X86. Voir si cela aide.

Ou vous devez enregistrer votre dll: http://riteshk.blogspot.com/2007/05/retrieving-com-class-factory-failed-due.html

2

L'exécution .NET exécute automatiquement l'application en tant que 64 bits et ne peut plus charger le composant COM 32 bits dans son processus.

Il est très facile de contourner ce problème si le composant COM dispose d'une interface compatible avec Automation. Créez une application COM + (Panneau de configuration-> Outils d'administration-> Services de composants) et ajoutez-y le composant. De cette façon, vous allez forcer la création du composant dans un processus séparé et vous ne vous soucierez plus que votre application cliente soit exécutée en tant qu'application 64 bits.

Questions connexes