p/invoke 32-разрядный dll из программы C#, работающей на x64 машине

У меня есть программа C#, которую я компилирую со всеми настройками по умолчанию на x64 компьютере.

Я хочу к p/invoke DLL, который я знаю, 32-разрядный (неуправляемый) C++ DLL.

Я могу заставить это работать когда мои прогоны программы C# над 32-разрядной машиной, но не 64-разрядной машиной.

Как я могу указать в вызове DllImport, что звоню в 32-разрядный dll?

Пример того, что я имею теперь:

[DllImport("test32bitdll.dll", SetLastError=true)]
public static extern void MyFunc();

У меня нет исходного кода файла test32bitdll.dll.

5
задан Net Citizen 23 June 2010 в 17:20
поделиться

2 ответа

Выполнение 32-битного неуправляемого кода в 64-битном процессе невозможно. Или наоборот. Доступные вам параметры:

  • Принудительно запускать EXE в режиме x86 с настройкой целевой платформы на вкладке «Сборка»
  • Перекомпилировать C ++ DLL в режиме x64. Часто это возможно без особых хлопот, при условии, что у вас есть исходный код, а не зависимость от какого-либо стороннего кода, доступного только в 32-битном формате
  • . Запустите C ++ DLL в суррогатном процессе, который принудительно запускается в 32-битном формате. битовый режим. Вам нужно будет использовать механизм межпроцессного взаимодействия, чтобы заставить ваш 64-битный процесс взаимодействовать с 32-битным суррогатом. Именованные каналы, сокеты, .NET Remoting, WCF - типичные варианты выбора в .NET.

Третий вариант может дать вам максимальную отдачу от вложенных средств, но он может быть медленным, если обменивается много данных и имеет тенденцию быть хрупким. Может быть трудно справиться с неудачей суррогатного процесса.

7
ответ дан 18 December 2019 в 14:42
поделиться

Самый простой способ заставить это работать - изменить ваш exe на сборку "только для x86".

6
ответ дан 18 December 2019 в 14:42
поделиться
Другие вопросы по тегам:

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