2008-09-24 13 views
39

Mam aplikację, którą próbujemy przenieść do wersji 64-bitowej z 32-bitowej. To .NET, skompilowany przy użyciu flag x64. Mamy jednak dużą liczbę bibliotek DLL napisanych w FORTRAN 90 skompilowanych dla 32-bitów. Funkcje bibliotek DLL FORTRAN są dość proste: wprowadzasz dane, wyciągasz dane; nie ma żadnego stanu. Nie spędzamy tam zbyt wiele czasu, łącznie około 3%, ale logika obliczeń, którą wykonuje, jest nieoceniona.Wywołanie 32-bitowego kodu z procesora 64-bitowego

Czy mogę w jakiś sposób wywołać 32-bitowe biblioteki DLL z kodu 64-bitowego? MSDN sugeruje, że nie mogę, kropka. Zrobiłem proste hakowanie i zweryfikowałem to. Wszystko powoduje zgłoszenie wyjątku dotyczącego nieprawidłowego punktu wejścia. Jedynym możliwym rozwiązaniem, jakie znalazłem do tej pory, jest utworzenie wrapperów COM + dla wszystkich 32-bitowych funkcji DLL i wywołanie COM z procesu 64-bitowego. To wydaje się dość bolesny. Możemy również uruchomić proces w emulacji WoW, ale wtedy pułap pamięci nie zostanie zwiększony, ograniczając się do około 1,6 gb.

Czy istnieje inny sposób wywołania 32-bitowych bibliotek DLL z 64-bitowego procesu CLR?

Odpowiedz

32

Musisz 32-bitową bibliotekę dll załadować do oddzielnego procesu 32-bitowego, a 64-bitowy proces komunikować się z nim za pomocą komunikacji międzyprocesowej. Nie sądzę, że istnieje sposób, w jaki 32-bitowa biblioteka dll może zostać załadowana do 64-bitowego procesu w przeciwnym razie.

Jest całkiem dobry artykuł tutaj:

Accessing 32-bit DLLs from 64-bit code

+0

To jest 64-bitowa -> COM -> 32-bitowa rzecz, którą opisałem. Po przeczytaniu tego artykułu i próbie pobrania próbki do pracy zdecydowałem, że nie ma lepszego sposobu. Przynajmniej mam taką nadzieję. –

+3

Odpowiedź Johna jest poprawna. W jednym procesie nie można mieszać modułów 32-bitowych i 64-bitowych. Musisz rozpocząć drugi proces. Zobacz także moją odpowiedź tutaj: http://stackoverflow.com/questions/6523075/how-to-force-net-application-to-run-in-32bit-mode/6533556#6533556 –

+2

Nie musisz koniecznie używać Pakowarki COM +, ale musisz użyć procesu 32-bitowego. –

1

Musisz napisać procesów wykonywalnych jako procesy 32-bitowe (wobec Any CPU lub x64), dzięki czemu zostaną one załadowane do WoW32 Widok. Spowoduje to załadowanie ich w 32-bitowym trybie emulacji i nie będzie problemu z punktem wejścia. Możesz pozostawić biblioteki w trybie AnyCPU, ale pliki wykonywalne muszą być skompilowane jako x86.

+1

Wygląda na to, że rozważali to, ale potrzebowali zwiększonego limitu pamięci, który 64-bitowe oferty –

+0

Jedna połowa to prawda: 32 bitowe procesy są uruchamiane na maszynie x64, jeśli skompilowano je jako x86. Ale jeśli twój plik wykonywalny to x86, a twoje biblioteki to AnyCPU - kompilator just in time zrobi z nich kod x64, co spowoduje, że będą niekompatybilne z 32-bitowym plikiem wykonywalnym. Tak więc ** wszystko włącznie z złożeniami ** musi być x86 lub AnyCPU. – Matt

0

Odpowiedź Johna jest poprawna, jeśli nie chcesz przekompilować istniejących bibliotek dll; jednak może to być również opcja dla ciebie.

Nasz zespół obecnie migruje nasz kod FORTRAN x86 do x64, aby zwiększyć pułap pamięci.

+0

działa tak długo, jak nie masz żadnych 32-bitowych zestawów innych producentów (bez kodu źródłowego), które musisz dodać jako odniesienie ... – Matt