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)?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top