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



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



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

586   2  

2 ответов:

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

Как 16-разрядные, так и 32-разрядные окна жили в 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, вы можете обойти его.

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

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

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

Comments

    Ничего не найдено.