2008-10-22 4 views
33

Ich habe kürzlich einen C# Windows-Dienst aktualisiert, um als 64-Bit-.net-Prozess zu laufen. Normalerweise wäre dies trivial, aber das System verwendet eine 32-Bit-DLL, die in C++ geschrieben ist. Es ist keine Option, diese DLL in 64 Bit zu konvertieren, also wickelte ich die DLL in einen separaten 32-Bit-.net-Prozess und legte eine .net-Schnittstelle per Remoting frei.Kann ich eine 32-Bit-DLL unter Windows in einen 64-Bit-Prozess laden?

Dies ist eine ziemlich zuverlässige Lösung, aber ich würde es vorziehen, das System als einen einzigen Prozess zu betreiben. Gibt es eine Möglichkeit, meine 32-Bit-DLL in einen 64-Bit-Prozess zu laden und direkt darauf zuzugreifen (vielleicht durch eine Art Thunk-Layer)?

Antwort

25

Nein, das geht nicht.

Sowohl 16-Bit- als auch 32-Bit-Windows lebten in einem linearen 32-Bit-Adressraum. Die Begriffe 16 und 32 beziehen sich auf die Größe des Versatzes relativ zum Selektor.

...

zunächst feststellen, dass eine Full-Size-16-Bit-Zeiger und ein 32-Bit-Zeiger flachen gleich groß sind. Der Wert 0x0123: 0x467 benötigt 32 Bit und wow, ebenso ein 32-Bit-Zeiger. Dies bedeutet, dass Datenstrukturen, die Zeiger enthalten, die Größe zwischen ihren 16-Bit- und 32-Bit-Gegenstücken nicht ändern. Ein sehr handlicher Zufall.

Keine dieser beiden Beobachtungen gilt für 32-Bit- bis 64-Bit-Thunking. Die Größe des Zeigers hat sich geändert, was bedeutet, dass das Konvertieren einer 32-Bit-Struktur in eine 64-Bit-Struktur und umgekehrt die Größe der Struktur ändert. Und der 64-Bit-Adressraum ist vier Milliarden Mal größer als der 32-Bit-Adressraum. Wenn im 64-Bit-Adressraum bei Offset 0x000006fb`Speicher vorhanden ist, kann der 32-Bit-Code nicht darauf zugreifen. Es ist nicht so, dass Sie ein temporäres Adressfenster erstellen können, da 32-Bit-Flat-Code über diese temporären Adressfenster nicht bekannt ist; Sie haben Selektoren verlassen, erinnerst du dich?

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

6

Wenn Ihre .NET-Anwendung eine Website in IIS ausgeführt wird, können Sie es umgehen.

Eine ASP.NET-Webseite, die auf IIS auf einem 64-Bit-Computer ausgeführt wird, wird von einer 64-Bit-Version des w3wp.exe-Prozesses gehostet. Wenn Ihre Webseite 32-Bit-DLLs verwendet, schlägt Ihre Site fehl.

In IIS können Sie jedoch in die erweiterten Einstellungen des Anwendungspools, auf dem die Site ausgeführt wird, wechseln und "32-Bit-Anwendungen aktivieren" in "true" ändern.

Es ist immer noch nicht in der Lage, 32-Bit-DLL innerhalb von 64-Bit-Prozess auszuführen, sondern stattdessen w3wp.exe als 32-Bit-Prozess ausgeführt wird.

+4

Die Frage besagt, dass der Prozess ein Windows-Dienst und nicht eine ASP.NET-Website ist. Darüber hinaus implementieren die von Ihnen beschriebenen IIS-Einstellungen effektiv dieselbe Lösung, die die Frage zu vermeiden versucht. –

Verwandte Themen