C++/CLI -- 0xc000007b (INVALID_IMAGE_FORMAT),带有 /clr 选项
我正在尝试构建一个 C++/CLI 可执行文件,静态链接 ffmpeg(libavcodec、libavformat、libavutil 和 swscale)。 如果我正常构建它(没有 /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
谢谢, 罗伯特
I'm trying to build a C++/CLI executable to which I statically link ffmpeg (libavcodec, libavformat, libavutil & swscale). It works fine if I build it normally (without /clr, so no CLR support), it works. However, when I add CLR support, it won't start up with a 0xc000007b. A "Hello World" C++/CLI app runs fine, though.
Supposedly the same thing happens with Boost::Threads, but since ffmpeg is pure C, I doubt it's using Boost.
My config:
- Visual Studio 2008 Professional SP1
- Windows XP Pro SP3 (x86)
- .NET Framework 3.5 SP1
Thanks,
Robert
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
它可能不使用 boost,但它可能使用线程和线程本地存储,这会导致同样的问题。 CLR 与 __declspec(thread) 不兼容。 我相信没有简单的解决方法,除非您愿意修改 ffmpeg 代码(如果您愿意,请搜索这些关键字以获取示例: clr, __declspec(thread) )。
我建议将 ffmpeg 隔离在不同的进程中,并使用一些进程间通信的方法。
It might not use boost, but it probably uses threads and thread local storage, which leads to the same problem. CLR is not compatible with __declspec(thread). I believe there is no simple work-around, unless you are willing to modify ffmpeg code (if you are, google those keywords for examples: clr, __declspec(thread) ).
I suggest isolating ffmpeg in a different process and using some means of interprocess communication.
我见过涉及 DirectEditServices 的类似问题。 该解决方案最终与线程单元类型相关。 在 .Net 2.0 及更高版本中,默认线程单元类型从 STA 切换为 MTA。 某些本机 C++ 对象不支持 MTA。 我通过生成一个线程并手动将公寓类型设置为 STA 获得了成功。 请记住,与不支持 STA 的本机 C++ 对象的任何进程间通信都必须发生在实例化该对象的 STA 线程上。
I've seen a similar issue that involved DirectEditServices. The solution ended up being related the Thread Apartment type. In .Net 2.0 and later the default thread apartment type switched from STA to MTA. Some native C++ objects do not support MTA. I had success by spawning a thread and manually setting the apartment type to STA. Keep in mind that any interprocess communications with a native C++ object that does not support STA must occur on the STA thread that instantiates the object.