2008-09-24 7 views
39

У меня есть приложение, которое мы пытаемся перенести на 64-битный с 32-битного. Это .NET, скомпилированный с использованием флагов x64. Тем не менее, у нас есть большое количество DLL, написанных в FORTRAN 90, скомпилированных для 32 бит. Функции в библиотеках FORTRAN довольно просты: вы вставляете данные, вы извлекаете данные; никакого состояния. Мы также не проводим там много времени, всего на 3%, но логика расчета, которую он выполняет, неоценима.Вызов 32-битного кода из 64-битного процесса

Можно ли как-то назвать 32-битные DLL-файлы из 64-битного кода? MSDN предполагает, что я не могу, период. Я сделал простой взлом и проверил это. Все выбрасывает недопустимое исключение точки входа. Единственное возможное решение, которое я нашел до сих пор, - создать COM + -комплексоры для всех 32-битных DLL-функций и вызывать COM из 64-битного процесса. Это кажется довольно головной болью. Мы также можем запустить процесс в эмуляции WoW, но тогда потолок памяти не увеличился бы, укутывая около 1,6 гб.

Есть ли другой способ вызова 32-битных DLL из 64-битного процесса CLR?

ответ

32

Вам потребуется иметь 32-разрядную dll, загруженную в отдельный 32-разрядный процесс, и ваш 64-битный процесс связывается с ним посредством межпроцессного взаимодействия. Я не думаю, что в любом случае 32-разрядная dll может быть загружена в 64-разрядный процесс.

Существует довольно хорошая статья здесь:

Accessing 32-bit DLLs from 64-bit code

+0

Это 64bit -> COM -> 32-битная вещь, которую я описывал. Прочитав эту статью и пытаясь заставить образец работать, я решил, что есть _got_, чтобы быть лучшим способом. По крайней мере, я надеюсь. – 2008-09-24 17:25:13

+3

Ответ Джона верен. В одном процессе нельзя смешивать 32-битные и 64-битные модули. Вам нужно начать второй процесс. См. Также мой ответ здесь: http://stackoverflow.com/questions/6523075/how-to-force-net-application-to-run-in-32bit-mode/6533556#6533556 – 2011-07-11 09:39:04

+2

Вам необязательно использовать COM +, но вам нужно использовать 32-битный процесс. – 2012-01-06 02:54:40

1

Вы должны написать свои исполняемые процессы, так что они будут загружены 32-разрядные процессы (в сравнении с любым процессором или x64) с WoW32 для Vista. Это загрузит их в режиме 32-разрядной эмуляции, и у вас не будет проблемы с точкой входа. Вы можете оставить свои библиотеки в режиме AnyCPU, но ваши исполняемые файлы должны быть скомпилированы как x86.

0

Ответ Джона верен, если вы не хотите перекомпилировать существующие DLL; однако это может быть и вариантом для вас.

Наша команда в настоящее время переносит наш код x86 FORTRAN на x64, чтобы увеличить потолок памяти.