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



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



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



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



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



Пример того, что у меня есть сейчас:



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


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

643   2  

2 ответов:

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

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

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

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

Comments

    Ничего не найдено.