2008-09-24 12 views
39

Ich habe eine Anwendung, die wir versuchen, von 32bit auf 64bit zu migrieren. Es ist .NET, kompiliert mit den x64 Flags. Wir haben jedoch eine große Anzahl von DLLs geschrieben in FORTRAN 90 für 32bit kompiliert. Die Funktionen in den FORTRAN-DLLs sind ziemlich einfach: Sie fügen Daten ein, Sie ziehen Daten heraus; Kein Zustand. Wir verbringen auch nicht viel Zeit dort, insgesamt vielleicht 3%, aber die Berechnungslogik, die es ausführt, ist von unschätzbarem Wert.Aufruf von 32-Bit-Code von 64-Bit-Prozess

Kann ich irgendwie die 32bit-DLLs aus 64-Bit-Code aufrufen? MSDN schlägt vor, dass ich nicht, Punkt. Ich habe ein paar einfache Hacking getan und dies überprüft. Alles löst eine ungültige Einstiegspunkt-Ausnahme aus. Die einzige mögliche Lösung, die ich bisher gefunden habe, ist, COM + -Wrapper für alle 32-Bit-DLL-Funktionen zu erstellen und COM aus dem 64-Bit-Prozess aufzurufen. Das scheint ein ziemlicher Kopfschmerz zu sein. Wir können den Prozess auch in der WoW-Emulation ausführen, aber dann wird die Speicherobergrenze nicht erhöht, da sie bei etwa 1,6 GB liegt.

Gibt es eine andere Möglichkeit, die 32-Bit-DLLs aus einem 64-Bit-CLR-Prozess aufzurufen?

Antwort

32

Sie müssen die 32-Bit-DLL in einen separaten 32-Bit-Prozess laden und Ihren 64-Bit-Prozess über Interprozesskommunikation mit ihm kommunizieren lassen. Ich glaube nicht, dass eine 32-Bit-DLL sonst in einen 64-Bit-Prozess geladen werden kann.

Es ist ein ziemlich guter Artikel hier:

Accessing 32-bit DLLs from 64-bit code

+0

Das ist die 64bit -> COM -> 32bit Sache, die ich beschrieb. Nachdem ich diesen Artikel gelesen hatte und versuchte, die Probe zur Arbeit zu bringen, entschied ich, dass es _got_ gibt, um ein besserer Weg zu sein. Zumindest hoffe ich das. –

+3

Johns Antwort ist korrekt. Es gibt keine Möglichkeit, 32-Bit- und 64-Bit-Module in einem Prozess zu mischen. Sie müssen einen zweiten Prozess starten. Siehe auch meine Antwort hier: http://stackoverflow.com/questions/6523075/how-to-force-net-application-to-run-in-32bit-mode/6533556#6533556 –

+2

Sie müssen nicht unbedingt verwenden COM + -Wrapper, aber Sie müssen einen 32-Bit-Prozess verwenden. –

1

Sie benötigen eine ausführbaren Prozesse zu schreiben, wie 32-Bit-Prozesse (im Vergleich zu Any CPU oder x64), so dass sie mit WOW32 geladen werden für Vista. Dadurch werden sie im 32-Bit-Emulationsmodus geladen, und Sie haben kein Einstiegspunktproblem. Sie können Bibliotheken im AnyCPU-Modus belassen, aber Ihre ausführbaren Dateien müssen als x86 kompiliert werden.

+1

Es klingt, als hätten sie dies in Betracht gezogen, aber sie brauchen die erhöhte Speicherobergrenze 64-Bit-Angebote –

+0

Eine Hälfte ist wahr: 32-Bit-Prozesse laufen auf einer x64-Maschine, wenn Sie sie als x86 kompilieren. Aber wenn Ihre ausführbare Datei x86 ist und Ihre Bibliotheken AnyCPU sind, wird der Just-in-Time-Compiler x64-Code daraus machen, was sie inkompatibel mit der (32-Bit-) ausführbaren Datei macht. Also, ** alles einschließlich der Baugruppen ** muss entweder x86 oder AnyCPU sein. – Matt

0

Johns Antwort ist korrekt, wenn Sie Ihre vorhandenen DLLs nicht neu kompilieren möchten; Aber das könnte auch eine Option für Sie sein.

Unser Team migriert derzeit unseren x86 FORTRAN-Code auf x64, um die Speicherobergrenze zu erhöhen.

+0

dies funktioniert, solange Sie keine 32bit 3rd Party Assemblies (ohne den Quellcode) haben, die Sie als Referenz hinzufügen müssen ... – Matt