Question

J'ai récemment mis à niveau un service Windows c # pour qu'il s'exécute en tant que processus .net 64 bits. Normalement, cela serait trivial, mais le système utilise une DLL 32 bits écrite en C ++. Ce n’est pas une option pour convertir cette DLL en 64 bits. J’ai donc intégré la DLL dans un processus .net 32 ??bits distinct et exposé une interface .net via remoting.

C'est une solution assez fiable, mais je préférerais que le système fonctionne en tant que processus unique. Comment puis-je charger ma DLL 32 bits dans un processus 64 bits et y accéder directement (peut-être via une sorte de couche thunking)?

Était-ce utile?

La solution

Non, vous ne pouvez pas.

  

Les versions 16 bits et 32 ??bits de Windows vivaient dans un espace d'adressage linéaire de 32 bits. Les termes 16 et 32 ??font référence à la taille du décalage par rapport au sélecteur.

     

...

     

Tout d'abord, notez qu'un pointeur 16 bits de taille normale et un pointeur plat de 32 bits ont la même taille. La valeur 0x0123: 0x467 nécessite 32 bits, et wow, un pointeur 32 bits aussi. Cela signifie que les structures de données contenant des pointeurs ne changent pas de taille entre leurs homologues 16 bits et 32 ??bits. Une coïncidence très pratique.

     

Aucune de ces deux observations n’est valable pour une synchronisation 32 bits à 64 bits. La taille du pointeur a changé, ce qui signifie que la conversion d'une structure 32 bits en une structure 64 bits et inversement modifie la taille de la structure . Et l'espace d'adressage 64 bits est quatre milliards de fois plus grand que celui d'adressage 32 bits. S'il y a de la mémoire dans l'espace adresse 64 bits à l'offset 0x000006fb`01234567, le code 32 bits ne pourra pas y accéder. Ce n'est pas comme si vous pouviez créer une fenêtre d'adresse temporaire, car le code non codé 32 bits ne connaissait pas ces fenêtres d'adresse temporaires; ils ont abandonné les sélecteurs, tu te souviens?

http://blogs.msdn.com/oldnewthing /archive/2008/10/20/9006720.aspx

Autres conseils

Si votre application .NET est un site Web exécuté dans IIS, vous pouvez le contourner.

Une page Web ASP.NET exécutée sur IIS sur un ordinateur 64 bits sera hébergée par une version 64 bits du processus w3wp.exe. Si votre page Web utilise des dll 32 bits, votre site échouera.

Toutefois, dans IIS, vous pouvez accéder aux paramètres avancés du pool d’applications exécutant le site et modifier "Activer les applications 32 bits". à vrai.

Il n'est donc toujours pas possible d'exécuter une dll 32 bits dans un processus 64 bits, mais il exécute plutôt w3wp.exe en tant que processus 32 bits.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top