在使用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);
但是在運作時,當調用該Dll中的方法時,就會報錯:
---------------------------
使用者控件測試容器
---------------------------
未能建立 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
友善大家下載下傳