2011-09-23 129 views
1

嘿傢伙和女孩:)好吧,所以我跑這個項目 - > http://www.helyar.net/2009/libvlc-media-player-in-c-part-2/它工作完美(他使用.net 2.0)但是,當我嘗試任何以上3.5它給 - > 無法加載DLL'libvlc':指定的模塊找不到。 (異常來自HRESULT:0x8007007E)libvlc媒體播放器在C#

有沒有任何解決方法有人做過這種排序呢? MANY thanks ppl:D:D:D:D

+0

它說clrealy「指定的模塊找不到。」所以你的問題是什麼?添加DLL的程序目錄。 – Tommix

回答

0

您必須將libvlc.dll複製到您的bin/debug文件夾中。它必須是您的VLC安裝文件夾中的一個(C:\program files\videolan\vlc

+0

我這樣做後:調用PInvoke函數'MyLibVLC!MyLibVLC.LibVlc :: libvlc_new'已不平衡的堆棧。這很可能是因爲託管的PInvoke簽名與非託管目標籤名不匹配。檢查PInvoke簽名的調用約定和參數是否與目標非託管簽名相匹配。 – David

+0

自該文章寫入並且其中定義的調用已過期後,API已更新。解決方案:a)修復p/invoke定義b)下載與使用的文章作者相同的VLC版本。 – jgauffin

5

在新的2.0.x VLC發行版中使用該示例時必須完成兩件事。首先,你必須以某種方式將libvlc DLL添加到搜索路徑中。我使用了SetDllDirectory的一個調用來完成這個技巧。您聲明爲:

static class LibVlc 
{ 
    . . . 
    [DllImport("kernel32.dll", SetLastError = true)] 
    public static extern bool SetDllDirectory(string lpPathName); 
    . . . 
} 

然後您可以調用此方法與VLC安裝的根文件夾。在我的PC上,我稱它爲:

LibVlc.SetDllDirectory(@"C:\Program Files (x86)\VideoLAN\VLC"); 

很明顯,對於正在分發的程序,此參數應該是可配置的。

接下來,VLC API顯然已經發生了變化,因爲沒有任何方法需要再次傳遞一個異常對象。它看起來應該檢查方法的返回值(例如,如果發生錯誤,libvlc_new()會返回NULL)。我沒有嘗試通過引用傳遞異常對象,像他一樣,但沒有它的調用都可以正常工作(並且我的接口現在完全匹配VLC API)。我還指定了在執行互操作時使用的調用約定,只是爲了向運行時清楚我所期望的參數傳遞順序等。例如,這裏是我對libvlc_new和libvlc_release的定義:

[DllImport("libvlc", CallingConvention=CallingConvention.Cdecl)] 
public static extern IntPtr libvlc_new(int argc, 
    [MarshalAs(UnmanagedType.LPArray, 
    ArraySubType = UnmanagedType.LPStr)] string[] argv); 

[DllImport("libvlc", CallingConvention=CallingConvention.Cdecl)] 
public static extern void libvlc_release(IntPtr instance); 

我希望這有助於!