2008-10-22 15 views
33

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

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

ответ

25

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

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

...

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

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

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

6

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

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

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

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

+4

В вопросе говорится, что этот процесс является службой Windows, а не веб-сайтом ASP.NET. Более того, параметры IIS, которые вы описываете, эффективно реализуют то же самое решение, которое пытается избежать. – 2011-12-14 14:30:53

 Смежные вопросы

  • Нет связанных вопросов^_^