Могу ли я загрузить 32-битную DLL в 64-битный процесс в Windows?

Недавно я обновил службу aC# windows для работы в качестве 64-битного.net-процесса. Обычно это было бы тривиально, но система использует 32-битную DLL, написанную на C++. Невозможно преобразовать эту DLL в 64-битную, поэтому я обернул DLL в отдельный 32-битный процесс.net и открыл интерфейс.net через удаленное взаимодействие.

Это довольно надежное решение, но я бы предпочел запустить систему как единый процесс. Можно ли как-нибудь загрузить свою 32-битную DLL в 64-битный процесс и получить к ней доступ напрямую (возможно, через какой-то слой)?

2 ответа

Решение

Нет, ты не можешь.

И 16-битная, и 32-битная Windows жили в 32-битном линейном адресном пространстве. Термины 16 и 32 относятся к размеру смещения относительно селектора.

...

Во-первых, обратите внимание, что полноразмерный 16-разрядный указатель и 32-разрядный плоский указатель имеют одинаковый размер. Значение 0x0123:0x467 требует 32 бита, и ничего себе, так же как и 32-битный указатель. Это означает, что структуры данных, содержащие указатели, не меняют размер между своими 16-битными и 32-битными аналогами. Очень удобное совпадение.

Ни одно из этих двух наблюдений не относится к 32-битному и 64-битному транкингу. Размер указателя изменился, что означает, что преобразование 32-разрядной структуры в 64-разрядную структуру и наоборот изменяет размер структуры. А 64-битное адресное пространство в четыре миллиарда раз больше, чем 32-битное адресное пространство. Если в 64-битном адресном пространстве имеется некоторая память со смещением 0x000006fb`01234567, 32-битный код не сможет получить к ней доступ. Вы не можете создать временное адресное окно, потому что 32-битный плоский код не знает об этих временных адресных окнах; они отказались от селекторов, помните?

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

Если ваше приложение.NET представляет собой веб-сайт, работающий в IIS, вы можете его обойти.

Веб-страница ASP.NET, работающая в IIS на 64-разрядной машине, будет размещена в 64-разрядной версии процесса w3wp.exe, и если ваша веб-страница использует 32-разрядные библиотеки DLL, ваш сайт не будет работать.

Однако в IIS вы можете перейти в Дополнительные настройки пула приложений, на котором запущен сайт, и изменить "Включить 32-разрядные приложения" на true.

Таким образом, он все еще не может запускать 32-битную DLL внутри 64-битного процесса, но вместо этого он запускает w3wp.exe как 32-битный процесс.

Другие вопросы по тегам