Вызов 32-битного кода из 64-битного процесса

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

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

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

 DaveInCaz25 мая 2018 г., 14:11
Возможный дубликатДоступ к x86 COM из x64 .NET

Ответы на вопрос(3)

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

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

 Matt12 окт. 2012 г., 13:48
это работает до тех пор, пока вы нене должно быть каких-либо 32-битных сторонних сборок (без исходного кода), которые нужно добавить в качестве ссылки ...
Решение Вопроса

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

Здесь есть довольно хорошая статья:

Доступ к 32-битным DLL из 64-битного кода

 Helge Klein11 июл. 2011 г., 11:39
John»ответ правильный. Невозможно объединить 32-разрядные и 64-разрядные модули в одном процессе. Вам нужно начать второй процесс. Смотрите также мой ответ здесь:stackoverflow.com/questions/6523075/...
 Rob Hunter06 янв. 2012 г., 03:54
Ты неОбязательно нужно использовать обертки COM +, но вам нужно использовать 32-битный процесс.
 DaveInCaz25 мая 2018 г., 14:11
Суррогатные процессы Windows кажутся хорошим потенциальным подходом:stackoverflow.com/a/359389/3195477
 David J. Sokol24 сент. 2008 г., 19:25
Тот'с 64 бит -> COM -> 32-битная вещь, которую я описывал. Прочитав эту статью и попытавшись заставить образец работать, я решил, чтополучил быть лучшим способом. По крайней мере, я на это надеюсь.
 John B. Lambe09 февр. 2016 г., 10:11
Это правильно. Смотрите Microsoft 'страница s:msdn.microsoft.com/en-us/library/windows/desktop/...

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

 Matt12 окт. 2012 г., 14:20
Одна половина верна: 32-разрядные процессы выполняются на компьютере с архитектурой x64, если вы компилируете их как x86. Но если ваш исполняемый файл - x86, а ваши библиотеки - AnyCPU - компилятор точно вовремя сделает из них код x64, что сделает их несовместимыми с (32-битным) исполняемым файлом. Так,все, включая сборки должен быть либо x86, либо AnyCPU.
 John Sibly25 сент. 2008 г., 13:05
Звучит так, как будто они обдумали это, но нужно увеличить потолок памяти, который предлагает 64-бит

Ваш ответ на вопрос