2008-12-11 11 views
22

J'ai un serveur x64 qui, depuis que mes bibliothèques sont compilées avec AnyCPU, fonctionne sous x64. Nous devons accéder à un composant COM enregistré sous x86. Je ne sais pas assez sur COM et mes recherches google ne me mènent nulle part. Question: Puis-je utiliser un lien de registre symbolique de x64 à x86 pour le composant COM? Dois-je également enregistrer le composant COM sous x64? Puis-je (toute déclaration ici ...)?Accès x86 COM à partir de x64 .NET

Merci.

Répondre

26

Si un composant exécute x64-native, il ne peut pas charger un serveur COM 32 bits en cours de traitement, car il s'agit d'un mauvais type de processus. Il y a deux solutions possibles:

  1. Si vous pouvez, construire une version 64 bits du code COM (qui s'inscrire bien sûr dans le registre 64 bits). C'est la solution la plus propre, mais peut ne pas être possible si vous n'avez pas le code pour le serveur COM. Exécutez votre composant .NET au format x86 32 bits au lieu de x64. Je suppose que vous avez déjà considéré et rejeté celui-ci pour une raison quelconque.

  2. Hébergez le composant COM hors processus à l'aide du fichier DLLhost.exe . Cela rendra les appels au serveur COM beaucoup plus lents (ils seront désormais des messages Windows interprocessus au lieu des appels de fonction natifs), mais sont par ailleurs transparents (vous n'avez rien à faire de spécial).

    Cela ne sera probablement pas une option si le serveur requiert un proxy-stub personnalisé au lieu d'utiliser le fichier oleaut32 normal (très rare, cependant), car il n'y aura pas de version 64-bit du proxy disponible . Tant qu'il peut utiliser le marshalling OLE ordinaire, vous pouvez simplement register it for surrogate activation.

+0

# 1 n'est pas possible car il n'existe pas de version x64. # 2 défait l'objectif de l'exécution sur x64. # 3 a bien fonctionné. Nous pouvons vivre avec les succès de performance ici jusqu'à ce que nous obtenions une nouvelle version de la bibliothèque. Merci de votre aide. –

2

Il est votre composant COM est logé dans un serveur COM (ie un processus séparé), vous aurez pas besoin de faire quelque chose de spécial que le sous-système COM sera à distance vos appels depuis votre application x64 à l'application X86 et de retour.

Si votre composant est un composant COM en cours de traitement, vous devrez repenser les choses car un processus 64 bits ne peut pas utiliser 32 bits dans les composants COM de processus. Vous pourriez forcer votre serveur à s'exécuter sous x86 afin que vous puissiez accéder aux composants (ils seront tous deux des processus 32 bits). Si vous ne voulez pas faire cela, vous devrez voir s'il existe une version x64 des composants COM que vous utilisez.

6

J'ai trouvé cette solution, Dealing with Legacy 32-bit Components in 64-bit Windows voir l'article:
• La conversion d'un type de projet à partir en processus hors processus
• En utilisant COM + comme hôte (ce travail pour moi)
• Utilisation dllhost en tant qu'hôte de substitution

+7

Lien miroir: http://www.scribd.com/doc/56629579/64-Bit-Insider-Volume-1-Issue-7 – Juhl

Questions connexes