2011-09-23 65 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); 

我希望这有助于!