C ++ / CLI - 0xc000007b (INVALID_IMAGE_FORMAT) с параметром / clr - PullRequest
1 голос
/ 05 августа 2009

Я пытаюсь создать исполняемый файл C ++ / CLI, к которому я статически привязываю ffmpeg (libavcodec, libavformat, libavutil & swscale). Он работает нормально, если я собираю его нормально (без / clr, поэтому без поддержки CLR), это работает. Однако, когда я добавляю поддержку CLR, он не запускается с 0xc000007b. Однако приложение C ++ / CLI "Hello World" работает нормально.

Предположительно, то же самое происходит с Boost :: Threads, но поскольку ffmpeg - это чистый C, я сомневаюсь, что он использует Boost.

Моя конфигурация:

  • Visual Studio 2008 Professional SP1
  • Windows XP Pro SP3 (x86)
  • .NET Framework 3.5 SP1

Спасибо, Роберт

Ответы [ 2 ]

2 голосов
/ 28 августа 2009

Я видел похожую проблему, связанную с DirectEditServices. В итоге решение было связано с типом резьбы. В .Net 2.0 и более поздних по умолчанию тип квартиры потока переключился с STA на MTA. Некоторые нативные объекты C ++ не поддерживают MTA. Я имел успех, породив нить и вручную установив тип квартиры на STA. Помните, что любые межпроцессные взаимодействия с собственным объектом C ++, который не поддерживает STA, должны происходить в потоке STA, который создает экземпляр объекта.

2 голосов
/ 11 августа 2009

Возможно, он не использует boost, но, вероятно, использует потоки и локальное хранилище потоков, что приводит к той же проблеме. CLR не совместим с __declspec (потоком). Я полагаю, что простого обходного пути нет, если только вы не захотите изменить код ffmpeg (если это так, поищите в качестве примера ключевые слова Google: clr, __declspec (thread)).

Я предлагаю изолировать ffmpeg в другом процессе и использовать некоторые средства межпроцессного взаимодействия.

...