4

Предположим, имеется какая-то DLL, которая существует в природе только, как х86, но хотелось бы ее прикрутить к проекту, который собран в х64.

Какие существую способы их подружить?

Самый банальный, который я знаю- это обернуть х86 в какой-нибудь х86 сервис, что бы приложение х64 слало ему запросы.

Может быть еще есть что-то интересное?

А если библиотека написана на неуправляемом языке, то нет ли еще каких-нибудь хитрых способов подружить?

iluxa1810
  • 24,899
  • 4
    Если библиотека управляемая — разница между x86- и x64-версиями оставляет аж 1 байт, и его можно поменять. (Но при этом полетит цифровая подпись, конечно.) – VladD Aug 29 '17 at 18:55
  • 1
    @VladD для смены флага даже стандартная утилита есть - CorFlags.exe –  Sep 03 '17 at 08:51
  • 1
    @PashaPash, ну это не интересный случай. Гораздо интереснее, когда разрядность нельзя поменять. Например, программа оперирует дровами х86, которых в природе нет на х64. – iluxa1810 Sep 03 '17 at 10:21
  • 1
    напрямую использовать, скорее всего, не получится. в x86 и в x64 разные calling conventions (не говоря уже о том, что расширенные регистры в x86 просто не будут видны), т.е. нельзя просто так взять и вызвать метод в коде другой битности. –  Sep 06 '17 at 14:53
  • Код для разных архитектур должен исполняться в разных процессах. Так что можно в теории использовать все что разрешено для межпроцессной коммуникации. И насколько я помню, из x64 процесса можно запустить отдельный x86 процесс. Так что сервис не единственное решение. – Eugene Krivenja Sep 07 '17 at 08:12
  • Я застал переход с 16 бит на 32. Там тоже была проблема вызова 32 битного кода из 16-битного, и наоборот. Решалась эта проблема на ассемблере относительно легко (добавлением 66 67 префикса к команде jmp/call/ret и примочка для стека что б не крашился), а для с/с++ писались функции шлюзы. Изучив архитектуру, можно шлюз написать самому. Думаю что шлюзы должны существовать. Возможно добавив метку с++ ассемблер - можно будет получить ответ. А уже DLL с с++ можно будет прикрутить к .NET. – nick_n_a Jun 19 '18 at 10:38
  • Можно сделать "обходной" вариант - запустить 64 и 32 битные приложения, соиденить их через pipe, или через ReadProcessMemory, и заставить обмениваться пакетами. Думаю это будет проще. Возможно RPC между ними будет работать... не освоил RPC. – nick_n_a Jun 19 '18 at 10:40

0 Answers0