在使用VLC自带的 libvlc.dll 和 libvlccore.dll 来制作ActiveX控件时,遇到一些问题,由于VLC提供是非托管的dll,所在C#调用时,需要用如下语句进行引入:
(当然了,首先要把这两个dll和plugins文件夹,拷备到项目的Debug文件夹下,
程序做好之后,需要带上libvlc.dll和libvlccore.dll,这两个是vlc的播放内核,因为vlc把编解码和格式解析的支持设计成了插件的形式,所以还必须要带上vlc的plugins目录里的插件。plugins目录文件有点大(因为libvlc支持的格式和功能非常多,如果你不需要,删掉对应插件即可))
// 创建一个libvlc实例,它是引用计数的
[DllImport("libvlc", CallingConvention =CallingConvention.StdCall, ExactSpelling =true)]
[SuppressUnmanagedCodeSecurity]
private staticexternIntPtr libvlc_new(int argc,IntPtr argv);
---------------------------
用户控件测试容器
---------------------------
未能创建 UserControl“*******ActiveX.*******ActiveX”
错误信息是“试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)”
提示格式不正确,首先想到可能的原因是64位系统编译的问题,将项目的目标平台改为了 x86,结果又报新的错误:
未能加载文件或程序集“file://\**********ActiveX\obj\x86\Debug\*******ActiveX.dll”或它的某一个依赖项。试图加载格式不正确的程序。
(在 obj\x86\Debug\ 文件夹下放置dll和plugins还是不行)
奇怪的是,我们之前已经有一套用C#开发的,可以执行的Win Form形式的播放器客户端,也是调用了VLC的这两个dll,是可以正常执行的,但是换成ActiveX控件的方式之后,却出现了这样的问题(两者代码和运行环境都是一致的)
换了一套XP(32位)下的VS2010环境重新编译之后,报了下面的错误:
---------------------------
Microsoft Visual C++ Runtime Library
---------------------------
Assertion failed!
Program: ... 10.0\Common7\IDE\UserControlTestContainer.exe
File: ../.././src/control/media_player.c
Line: 360
Expression: instance
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts
(Press Retry to debug the application - JIT must be enabled)
---------------------------
终止(A) 重试(R) 忽略(I)
---------------------------
还是不能正常调用!
================================================
百思不得其解,不过肯定是系统环境和dll不兼容,尝试降低了一个VLC版本(v 1.1.11),将v 1.1.11下的两个dll,和plugins文件夹,拷到了Debug文件夹下(XP环境中),问题竟然解决了!!
由些想到,64位的 Win8 中,会不会也是这个原因,可惜的是,重新替换了dll和plugins文件夹后,依然报错!
错误信息是“试图加载格式不正确的程序。
好在终于有一套可以成功运行的环境了:
XP(32位) + VLC(v 1.1.11)
有遇到类似问题的朋友,可以讨论一下!
原始的开发环境如下:
操作系统环境:Win8 (64位)
开发环境: VS2010 C#
VLC版本:2.0.8
VLC 1.1.11 的开发插件,已上传至: http://download.csdn.net/detail/dzf203/5958655
方便大家下载