Frage

Ich habe vor kurzem eine c # Windows-Dienst ausgeführt werden als 64-Bit-.net-Prozess aufgewertet. Normalerweise wäre dies trivial, aber das System verwendet eine DLL 32-Bit geschrieben in C ++. Es ist keine Option, diese DLL zu 64 Bit zu konvertieren, so wickelte ich die DLL in einem separaten 32-Bit-.net-Prozess und eine .net-Schnittstelle über Remote ausgesetzt.

Dies ist eine recht zuverlässige Lösung, aber ich würde es vorziehen, um das System als einzigen Prozess ausgeführt werden. Gibt es eine Möglichkeit kann ich meine 32-Bit-DLL in einen 64-Bit-Prozess geladen und direkt zugreifen (vielleicht durch eine Art Thunk Schicht)?

War es hilfreich?

Lösung

Nein, Sie können es nicht.

  

Sowohl 16-Bit- und 32-Bit-Windows lebte in einem 32-Bit-linearen Adressraum. Die Begriffe 16 und 32 beziehen sich auf die Größe des Offset in Bezug auf den Wähler.

     

...

     

Beachten Sie zunächst, dass ein Full-Size-16-Bit-Zeiger und ein 32-Bit-Flach Zeiger die gleiche Größe haben. Der Wert 0x0123: 0x467 erfordert 32 Bits, und wow, tut so auch eine 32-Bit-Zeiger. Dies bedeutet, dass Datenstrukturen Zeiger enthalten, nicht ändern Größe zwischen ihren 16-Bit- und 32-Bit-Pendants. Ein sehr handlicher Zufall.

     

Keine dieser beiden Beobachtungen hält für 32-Bit auf 64-Bit-Thunk wahr. Die Größe des Zeigers geändert hat, was bedeutet, dass eine 32-Bit-Struktur in eine 64-Bit-Struktur und umgekehrt Umwandeln die Größe der Struktur ändert . Und der 64-Bit-Adressraum beträgt vier Milliarden Mal größer ist als der 32-Bit-Adressraum. Wenn es etwas Speicher im Adressraum 64-Bit ist bei Offset 0x000006fb`01234567, 32-Bit-Code wird nicht in der Lage, darauf zuzugreifen. Es ist nicht wie Sie eine temporäre Adresse Fenster bauen kann, weil 32-Bit-Flach Code nicht über diese temporäre Adresse Fenster nicht kennt; sie verlassen Selektoren, schon vergessen?

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

Andere Tipps

Wenn Sie Ihre .NET-Anwendung ist eine Website in IIS Sie es umgehen können.

Eine ASP.NET-Webseite auf einem Computer 64-Bit auf dem IIS ausgeführt wird durch eine 64-Bit-Version des w3wp.exe-Prozess gehostet werden, und wenn Ihre Webseite verwendet 32-Bit-DLLs Ihre Website wird scheitern.

Jedoch in IIS können Sie die erweiterten Einstellungen des Application-Pool gehen in die Seite ausgeführt wird, und ändern Sie "Enable 32-Bit-Anwendungen" auf true gesetzt.

Es ist also nach wie vor nicht in der Lage 32-Bit-DLL innerhalb 64-Bit-Prozesses ausgeführt werden, sondern es läuft w3wp.exe als 32-Bit-Prozess statt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top