2008-10-22 10 views
33

J'ai récemment mis à niveau un service C# windows pour l'exécuter en tant que processus .net 64 bits. Normalement, ce 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 enveloppé la DLL dans un processus .net 32 ​​bits séparé et exposé une interface .net via l'accès distant.Puis-je charger une DLL 32 bits dans un processus 64 bits sous Windows?

Cette solution est assez fiable, mais je préférerais exécuter le système en tant que processus unique. Est-il possible de charger ma DLL 32 bits dans un processus 64 bits et y accéder directement (peut-être à travers une sorte de couche Thunking)?

Répondre

25

Non, vous ne pouvez pas.

Windows 16 bits et 32 ​​bits vivaient dans un espace d'adressage linéaire 32 bits. Les termes 16 et 32 ​​se réfèrent à 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 32 bits sont de la même taille. La valeur 0x0123: 0x467 nécessite 32 bits, et wow, ainsi qu'un pointeur 32 bits. 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 ne se vérifie pour une thunking de 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 vice versa modifie la taille de la structure. Et l'espace d'adressage 64 bits est quatre milliards de fois plus grand que l'espace d'adressage 32 bits. S'il y a de la mémoire dans l'espace d'adressage 64 bits au décalage 0x000006fb`, le code 32 bits ne pourra pas y accéder. Ce n'est pas comme si vous pouviez construire une fenêtre d'adresse temporaire, car le code plat 32 bits ne connaît pas ces fenêtres d'adresses temporaires; ils ont abandonné les sélecteurs, tu te souviens?

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

6

Si votre application .NET est un site Web en cours d'exécution dans IIS, vous pouvez la contourner. Une page Web ASP.NET s'exécutant sur IIS sur un ordinateur 64 bits sera hébergée par une version 64 bits du processus w3wp.exe et 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 remplacer «Activer les applications 32 bits» par «true». Il n'est donc toujours pas possible d'exécuter une DLL 32 bits à l'intérieur du processus 64 bits, mais exécute plutôt w3wp.exe en tant que processus 32 bits à la place.

+4

La question indique que le processus est un service Windows plutôt qu'un site Web ASP.NET. De plus, les paramètres IIS que vous décrivez implémentent efficacement la même solution que la question tente d'éviter. –

Questions connexes