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-файл.
2 ответов:
Выполнение 32-разрядного неуправляемого кода в 64-разрядном процессе невозможно. Или наоборот. Доступные варианты:
- принудительно запустите исполняемый файл в режиме x86 с настройкой целевой платформы на вкладке сборка
- Перекомпилируйте библиотеку DLL C++ в режиме x64. Это часто возможно без особых проблем, при условии, что у вас есть исходный код, а не зависимость от какого-то стороннего кода, который доступен только в 32-битном формате
- запустите библиотеку DLL C++ в суррогатном процессе, который вынужден запуск в 32-разрядном режиме. Вам нужно будет использовать механизм межпроцессной связи, чтобы заставить ваш 64-разрядный процесс разговаривать с 32-разрядным суррогатом. Именованные каналы, сокеты, удаленное взаимодействие .NET, WCF являются типичными вариантами в. NET.
3-й вариант может дать вам наибольший толчок для вашего доллара, но он может быть медленным, если есть много данных, которыми обмениваются, и имеет тенденцию быть хрупким. Может быть трудно справиться с неудачей суррогатного процесса.
Comments