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

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

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

Ответы [ 2 ]

25 голосов
/ 22 октября 2008

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

И 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

6 голосов
/ 15 ноября 2008

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

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

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

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

...