C ++ / CLI & # 8212; 0xc000007b (INVALID_IMAGE_FORMAT) avec l'option / clr activée
-
22-07-2019 - |
Question
J'essaie de créer un exécutable C ++ / CLI auquel je lie statiquement ffmpeg (libavcodec, libavformat, libavutil & swscale). Cela fonctionne bien si je le construit normalement (sans / clr, donc pas de support CLR), ça marche. Cependant, lorsque j'ajoute le support CLR, il ne démarre pas avec un 0xc000007b. Un "Hello World" L'application C ++ / CLI fonctionne correctement, cependant.
Semblablement, la même chose se produit avec Boost :: Threads, mais comme ffmpeg est du pur C, je doute qu’il utilise Boost.
Ma configuration:
- Visual Studio 2008 Professional SP1
- Windows XP Pro SP3 (x86)
- .NET Framework 3.5 SP1
Merci, Robert
La solution
Il n’est peut-être pas utilisé de boost, mais il utilise probablement des threads et le stockage local des threads, ce qui pose le même problème. CLR n'est pas compatible avec __declspec (thread). Je crois qu’il n’existe pas de solution simple, à moins que vous ne souhaitiez modifier le code ffmpeg (si vous le souhaitez, recherchez ces mots clés dans Google: CLR, __declspec (thread)).
Je suggère d’isoler ffmpeg dans un processus différent et d’utiliser un moyen de communication interprocessus.
Autres conseils
J'ai constaté un problème similaire impliquant DirectEditServices. La solution a fini par être liée au type Thread Apartment. Dans .Net 2.0 et versions ultérieures, le type d'appartement de thread par défaut est passé de STA à MTA. Certains objets C ++ natifs ne prennent pas en charge MTA. J'ai réussi à créer un thread et à définir manuellement le type d'appartement sur STA. N'oubliez pas que toute communication interprocessus avec un objet C ++ natif qui ne prend pas en charge STA doit avoir lieu sur le thread STA qui instancie l'objet.