32 бита dll импортирующий в приложении .NET на 64 бита

У меня есть проблема, я пытался решить ее с тех пор вчера, но никакая удача. У меня есть 32-разрядный Delphi DLL, в котором я хочу импортировать его к Приложению WIN.NET. Это приложение должно быть основано на режиме ANY CPU. Конечно, исключение, BadImageFormatException брошен, что означает, что 64-разрядные приложения не могут загрузить x86 DLLs. Я погуглил вокруг и нашел решение, оно сказало, что я должен сделать обертку, но это не было ясно для меня. Кто-либо может сказать мне, как решить эту проблему, есть ли какой-либо возможный способ, в котором я могу импортировать 32-разрядный Delphi DLL к программе, созданной под какой-либо архитектурой ЦП (64-разрядный, 32-разрядный) или возможно другое решение?

8
задан Lahiru Jayathilake 26 August 2019 в 10:18
поделиться

5 ответов

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

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

5
ответ дан 5 December 2019 в 07:10
поделиться

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

1
ответ дан 5 December 2019 в 07:10
поделиться

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

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

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

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

14
ответ дан 5 December 2019 в 07:10
поделиться

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

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

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

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

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

2
ответ дан 5 December 2019 в 07:10
поделиться

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

Неприятно, но может сработать, если вам нужно лишь время от времени звонить.

1
ответ дан 5 December 2019 в 07:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: