Есть ли способ загрузить 32-битную DLL из управляемого 64-битного кода, не понижая управляемый код до 32-битного? - PullRequest
2 голосов
/ 31 марта 2011

У меня есть сборка, Utils, которая настроена на сборку «Любой процессор», и у меня есть управляемый EXE, который также настроен на сборку как «Любой процессор».Exe использует мою сборку Utils.

Моя сборка Utils ДОЛЖНА загрузить неуправляемую 32-битную DLL-библиотеку не-com и вызвать некоторые функции.

Я получаю исключение "Была сделана попытка загрузитьпрограмма с неверным форматом. "каждый раз.

Можно ли по-прежнему запускать мой EXE и сборку в 64-битном режиме, но при этом загружать 32-битную DLL для выполнения простых вызовов функций?

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

Есть ли способ?Я пытался использовать LoadLibrary, которая просто возвращает 0 указатель при вызове из 64-битного кода, и DllImport, который дает мне исключение.

Спасибо за вашу помощь.

Ответы [ 3 ]

4 голосов
/ 31 марта 2011

Нет, это невозможно.Если вы не можете обновить библиотеку DLL до 64-битной, вам придется сделать что-то отчаянное, например, разместить ее в 32-битном процессе и использовать один из механизмов межпроцессного взаимодействия .NET для ее использования.Как WCF.

2 голосов
/ 31 марта 2011

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

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

Код в корне несовместиммежду этими двумя случаями, так что на самом деле нет никакого способа.

Либо:

  1. Измените вашу программу и все другие процессы, которые должны взаимодействовать с этой сборкой, чтобы также быть 32-бит
  2. Измените также сборку на Любой процессор
  3. Используйте процесс прокладки и IRPC, например WCF или аналогичный
0 голосов
/ 31 марта 2011

Нет. Все должно быть одинаково.

...