C ++ / CLI — / clrオプションをオンにした0xc000007b(INVALID_IMAGE_FORMAT)
-
22-07-2019 - |
質問
ffmpeg(libavcodec、libavformat、libavutil& swscale)を静的にリンクするC ++ / CLI実行可能ファイルをビルドしようとしています。 (/ clrがなく、CLRがサポートされていない)正常にビルドすると正常に動作します。ただし、CLRサポートを追加すると、0xc000007bで起動しません。 「Hello World」ただし、C ++ / CLIアプリは正常に動作します。
Boost :: Threadsでも同じことが起こりますが、ffmpegは純粋なCなので、Boostを使用しているのではないかと思います。
私の設定:
- Visual Studio 2008 Professional SP1
- Windows XP Pro SP3(x86)
- .NET Framework 3.5 SP1
ありがとう、 ロバート
解決
ブーストを使用しない場合もありますが、おそらくスレッドとスレッドローカルストレージを使用するため、同じ問題が発生します。 CLRは__declspec(thread)と互換性がありません。 ffmpegコードを変更する場合を除き、簡単な回避策はないと思います(例:clr、__ declspec(thread)のキーワードをGoogleで検索してください)。
別のプロセスでffmpegを分離し、プロセス間通信の手段を使用することをお勧めします。
他のヒント
DirectEditServicesに関連する同様の問題を見てきました。ソリューションは、スレッドアパートメントタイプに関連することになりました。 .Net 2.0以降では、デフォルトのスレッドアパートメントタイプがSTAからMTAに切り替わりました。一部のネイティブC ++オブジェクトはMTAをサポートしていません。スレッドを生成し、アパートメントタイプを手動でSTAに設定することで成功しました。 STAをサポートしないネイティブC ++オブジェクトとのプロセス間通信は、オブジェクトをインスタンス化するSTAスレッドで発生する必要があることに注意してください。