Posso caricare una DLL a 32 bit in un processo a 64 bit su Windows?
Domanda
Di recente ho aggiornato un servizio c # windows per essere eseguito come processo .net a 64 bit. Normalmente, questo sarebbe banale, ma il sistema utilizza una DLL a 32 bit scritta in C ++. Non è un'opzione per convertire questa DLL a 64 bit, quindi ho racchiuso la DLL in un processo separato .net a 32 bit ed esposto un'interfaccia .net tramite telecomando.
Questa è una soluzione abbastanza affidabile, ma preferirei eseguire il sistema come un singolo processo. Esiste un modo per caricare la mia DLL a 32 bit in un processo a 64 bit e accedervi direttamente (forse attraverso una sorta di thunking layer)?
Soluzione
No, non puoi.
Windows a 16 e 32 bit viveva in uno spazio di indirizzi lineare a 32 bit. I termini 16 e 32 si riferiscono alla dimensione dell'offset rispetto al selettore.
...
Innanzitutto, nota che un puntatore full-size a 16 bit e un puntatore flat a 32 bit hanno le stesse dimensioni. Il valore 0x0123: 0x467 richiede 32 bit e wow, così come un puntatore a 32 bit. Ciò significa che le strutture di dati contenenti puntatori non cambiano dimensione tra le loro controparti a 16 e 32 bit. Una coincidenza molto utile.
Nessuna di queste due osservazioni è valida per il thunking da 32 a 64 bit. La dimensione del puntatore è cambiata, il che significa che la conversione di una struttura a 32 bit in una struttura a 64 bit e viceversa modifica la dimensione della struttura . E lo spazio degli indirizzi a 64 bit è quattro miliardi di volte più grande dello spazio degli indirizzi a 32 bit. Se è presente della memoria nello spazio degli indirizzi a 64 bit nell'offset 0x000006fb`01234567, il codice a 32 bit non sarà in grado di accedervi. Non è che puoi costruire una finestra di indirizzo temporaneo, perché il codice flat a 32 bit non conosce queste finestre di indirizzo temporaneo; hanno abbandonato i selettori, ricordi?
http://blogs.msdn.com/oldnewthing /archive/2008/10/20/9006720.aspx
Altri suggerimenti
Se l'applicazione .NET è un sito Web in esecuzione in IIS, è possibile aggirarlo.
Una pagina Web ASP.NET in esecuzione su IIS su un computer a 64 bit sarà ospitata da una versione a 64 bit del processo w3wp.exe e se la tua pagina web utilizza dll a 32 bit, il tuo sito fallirà.
Tuttavia in IIS è possibile accedere alle Impostazioni avanzate del pool di applicazioni che esegue il sito e modificare " Abilita applicazioni a 32 bit " su true.
Quindi non è ancora in grado di eseguire dll a 32 bit all'interno di un processo a 64 bit, ma invece esegue w3wp.exe come processo a 32 bit.