Puis-je charger une DLL 32 bits dans un processus 64 bits sur Windows?

j'ai récemment mis à niveau un service c# windows pour l'exécuter comme un processus 64 bits .net. 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, donc j'ai enveloppé la DLL dans un processus séparé 32 bits.net et exposé une interface. net via remoting.

c'est une solution assez fiable, mais je préférerais utiliser le système comme un seul processus. Est-ce que je peux charger ma DLL 32 bits dans un 64 bits traiter et y accéder directement (peut-être par une sorte de couche de tonneau)?

33
demandé sur Lee 2008-10-22 14:25:29

2 réponses

Non, tu ne peux pas.

les fenêtres de 16 et 32 bits vivaient dans un espace d'adresse linéaire de 32 bits. Les Termes 16 et 32 font référence à la taille de l'offset 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, un pointeur 32 bits. Cela signifie que les structures de données contenant des pointeurs ne changent pas la taille entre leurs contreparties 16 bits et 32 bits. Très pratique coïncidence.

ni l'une ni l'autre de ces deux observations ne s'applique au tonneau 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 change la taille de la structure . Et l'espace d'adresse 64 bits est quatre milliards de fois plus grand que l'espace d'adresse 32 bits. Si il y a de la mémoire dans l'espace d'adresse 64 bits à offset 0x000006fb`01234567, le code 32 bits ne pourra pas y accéder. Ce n'est pas comme si vous pouvez construire une fenêtre d'adresse temporaire, parce que le code à 32 bits ne connait pas ces fenêtres d'adresse temporaires; ils ont abandonné les sélecteurs, vous vous souvenez?

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

25
répondu Jon Grant 2017-10-20 09:20:33

si votre application .NET est un site Internet tournant dans IIS, vous pouvez le contourner.

An ASP.NET la page Web tournant sur IIS sur une machine 64 bits sera hébergée par une version 64 bits du w3wp.exe processus, et si votre page Web utilise 32-bit dlls votre site va échouer.

cependant dans IIS vous pouvez aller dans les paramètres avancés de la piscine D'Application qui exécute le site, et changer" Enable 32-bit applications " à true.

donc c'est toujours pas capable d'exécuter la dll 32 bits à l'intérieur du processus 64 bits, mais plutôt il exécute w3wp.exe comme un processus de 32 bits à la place.

6
répondu Frode Lillerud 2008-11-14 23:00:56