2010-10-21 6 views
0

J'ai développé un serveur Com et Windows XP 32 bits. Pour tester le serveur Com j'ai créé un client avec C# pour appeler les fonctions via Interop. Tout fonctionne bien, mais maintenant je dois faire fonctionner ComServer sur un système Windows 7 64 bits. J'ai pris la DLL ComServer et le C# EXE sur l'ordinateur 64 bits, enregistré la DLL ComServer avec regsrv32 et démarré le programme C#. Wen i a d'abord essayé d'accéder à une fonction ComServer tout ce que je reçois est l'erreur:Serveur 32 bits Com sur système 64 bits

System.Runtime.InteropServices.COMException (0x80040154): Die COM-Klassenfactory für die Komponente mit CLSID {BA4D7F46-A47E-4CB9-A153-2B4657C4DD29} konnte aufgrund des folgenden Fehlers nicht abgerufen werden: 80040154.

en anglais:

System.Runtime.InteropServices.COMException (0x80040154): The COM-Classfactory for the Component with the CLSID {BA4D7F46-A47E-4CB9-A153-2B4657C4DD29} was not able to be called due to the Error: 80040154.

Whhat qui ne va pas ici? N'est-il pas possible d'appeler une DLL 32 bits sur un système 64 bits? Si oui, comment fonctionnent tous les autres programmes 32 bits?

concernant camelord

Répondre

1

Vous ne pouvez pas charger une bibliothèque 32 bits dans un processus 64 bits et vice versa - la bibliothèque et le processus doit être de même bitness.

La meilleure solution consiste à obtenir une version 64 bits de la bibliothèque du serveur COM. Si cela est impossible (ce qui est tout à fait habituelle) vous avez deux options:

  • que le programme consomme 32 bits (probablement vous devez changer la cible de « Any CPU » à « x86 » dans Visual Studio)
  • force le serveur COM dans un processus de substitution (utilisez COM + pour cela).

Dans le premier cas, vous créez à la fois le programme et le serveur COM 32 bits et la bibliothèque du serveur COM se charge correctement. Dans le second cas, COM + crée un processus de substitution 32 bits et charge la bibliothèque, votre programme communique avec ce processus via RPC, de sorte que vous ne vous souciez pas de la différence de bits.

Les deux options ont des inconvénients. Dans le premier cas, vous faites votre programme 32 bits même sur les systèmes 64 bits. Dans le second cas, vous rencontrez des frais généraux en raison des communications interprocessus.

+0

OK, merci. C'est ce que je pensais. J'essaie de le compiler pour 64 bits. – camelord

+0

@camelord: J'ai mal tapé. Le programme doit être 32 bits, pas 64 bits. – sharptooth

0

De here:

Utilisez corflags avec le/32bit + commutateur pour obtenir l'application de fonctionner en mode 32 bits

CorFlags.exe assembly [options]

+0

Wow. Est-ce effectivement la même chose que de changer la cible et de la recompiler? – sharptooth

+0

Non, vous êtes en train de changer le serveur de l'appelant pas com. –

+0

Oui, je vois. Mais pourrais-je tout aussi bien ouvrir le projet appelant, changer la cible et recompiler l'appelant? Aurait-il le même effet ou un autre effet? – sharptooth

Questions connexes