Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

Нет, вы не можете.

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

...

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

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

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

Ответ 2

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

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

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

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