У меня есть сторонний файл C++.dll, который экспортирует некоторые классы, которые я хочу использовать с С#. DLL - это приложение Win32, и я работаю над Windows 8.1 с помощью VS2013. Когда я настраивал программу С# под "Any CPU", я получаю сообщение об ошибке "System.BadImageFormatException". Я читал другие места, что может быть вызвано объединением x86 и x64. Поэтому я перекомпилировал программу С# как x86. Теперь я получаю "Невозможно загрузить DLL" libsword.dll ": указанный модуль не найден". Я убедился, что dll находится в соответствующем каталоге.
Все это отлично работает в Linux с помощью Mono.
На данный момент я понятия не имею, как действовать.
Спасибо, Джон
Проблема была в библиотеке C++, которая изначально была написана и разработана для Linux. Экспорт был определен как:
define SWDLLEXPORT _declspec( dllexport )
Который использовался как:
const char * SWDLLEXPORT function_name(args)
который работал в Linux, но не в Windows. Изменение сигнатуры функции:
const char SWDLLEXPORT * function_name(args)
Работает как в Linux, так и в Windows.
BadImageFormatException вызывается, когда вы обрабатываете обычный собственный C++ код в DLL, как если бы это был код.NET. .NET также помещает код в файлы.DLL.
Вам нужно будет создать объявления С# для кода C++, чтобы.NET знал, как перейти от управляемого кода (.NET/С#) к собственному (C++) коду. Это довольно сложно, в зависимости от того, как выглядит код в вашей сторонней библиотеке. Слишком много для меня, чтобы размышлять, что вам нужно делать.
BadImageFormatException
не возникает при попытке загрузить неуправляемую сборку - вместо этого этоFileLoadException
.BadImageFormatException
- это когдаBadImageFormatException
сборка не соответствует процессу, в который она загружена, или если каркас не понимает версию, для которой он создан.