32 бит dll импорт в 64 bit.Net применение

У меня проблема, я пытаюсь решить со вчерашнего дня, но не повезло. у меня есть 32 бит Delphi dll, который я хочу импортировать в .NET Win Application. это приложение должно быть построено на любом режиме процессора. конечно, есть BadImageFormatException, что означает, что в x64 приложение не может быть загружено x86 dll.. я погуглил и нашел решение, он сказал, что я должен сделать обертку, но для меня это было неясно. кто-нибудь может сказать как решить эту проблему, есть ли способ я могу импортировать 32bit Delphi dll в программе встроен любой CPU или x64 режим (возможно, другое решение).

5 ответов


общая идея может заключаться в том, чтобы обернуть вашу (неуправляемую) 32-разрядную DLL с управляемой 32-разрядной dll-оболочкой и сделать ее видимой. Это позволяет вызывать вашу DLL-оболочку через ее COM-интерфейс.

вы можете использовать com-суррогат, чтобы ваша com-библиотека dll выглядела как сервер com вне процесса. Взгляните на этот вопрос SO для получения дополнительной информации по этой теме:доступ к x86 COM из x64 .NET.


Что вам нужно сделать, это написать приложение-оболочку, в котором размещается 32-разрядный DLL-файл, в 32-разрядном процессе.

ваше 64-разрядное приложение затем должно поговорить с этим 32-разрядным процессом, через сетевые средства или сделав функции DLL доступными через COM-объект или аналогичный.

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

при компиляции приложения для 32-разрядного только не вариант, у вас нет выбора, кроме как создать хост-приложение.


Как я понимаю, у вас нет возможности использовать 32-разрядную DLL из 64-разрядного приложения. Тем не менее, вы можете скомпилировать приложение только для X86.

решение, которое вы нашли, может быть о том, как использовать DLL, которая существует для 32 - и 64-разрядных версий в "любом CPU"-скомпилированном проекте в зависимости от того, работает ли приложение в 32 - или 64-разрядной среде.

для этого вы можете написать две DLL-оболочки на C#, одну для 64-разрядной и одну для 32-разрядной и использовать соответствующая оболочка зависит от того, работаете ли вы на 64-разрядной или 32-разрядной ОС.

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

таким образом, вам нужно либо скомпилировать приложение для 32-разрядной версии, либо создать 64-разрядную версию вашей DLL.


решение, хотя немного беспорядок может быть написать отдельное 32-разрядное приложение, которое вы можете поговорить с вашим 64-разрядным приложением, таким как консольное приложение, в/из которого вы отправляете команды.

не очень, но может работать, если вам нужен только случайный вызов.


просто скомпилируйте приложение .Net как платформу x86. Он будет работать на машинах x64, и он будет использовать вашу 32-битную DLL. Не тратьте время на обертку.