C++/CLI — 0xc000007b (INVALID_IMAGE_FORMAT) с включенной опцией /clr
-
22-07-2019 - |
Вопрос
Я пытаюсь создать исполняемый файл C++/CLI, к которому статически привязываю ffmpeg (libavcodec, libavformat, libavutil и swscale).Он работает нормально, если я его собираю нормально (без /clr, поэтому нет поддержки CLR), он работает.Однако когда я добавляю поддержку CLR, она не запускается с 0xc000007b.Однако приложение C++/CLI «Hello World» работает нормально.
Предположительно то же самое происходит с Boost::Threads, но поскольку ffmpeg — это чистый C, я сомневаюсь, что он использует Boost.
Моя конфигурация:
- Visual Studio 2008 Профессиональный пакет обновления 1 (SP1)
- Windows XP Pro SP3 (x86)
- .NET Framework 3.5 с пакетом обновления 1
Спасибо, Роберт
Решение
Возможно, он не использует boost, но, вероятно, использует потоки и локальное хранилище потоков, что приводит к той же проблеме.CLR несовместима с __declspec(thread).Я считаю, что простого обходного пути нет, если только вы не хотите изменить код ffmpeg (если да, поищите в Google эти ключевые слова для примера:clr, __declspec(поток)).
Я предлагаю изолировать ffmpeg в другом процессе и использовать некоторые средства межпроцессного взаимодействия.
Другие советы
Я видел аналогичную проблему, связанную с DirectEditServices.В конечном итоге решение было связано с типом Thread Apartment.В .Net 2.0 и более поздних версиях тип подразделения потока по умолчанию переключился с STA на MTA.Некоторые собственные объекты C++ не поддерживают MTA.Мне удалось создать поток и вручную установить тип квартиры на STA.Имейте в виду, что любое межпроцессное взаимодействие с собственным объектом C++, не поддерживающим STA, должно происходить в потоке STA, который создает экземпляр объекта.