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

StackOverflow https://stackoverflow.com/questions/225151

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

Как 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-разрядные приложения " к истине.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top