C# libvlc媒体播放器#

C# libvlc媒体播放器#,c#,.net,media-player,libvlc,C#,.net,Media Player,Libvlc,嘿,小伙子们,姑娘们:)好吧,我开始做这个项目-> 它工作得很好(他使用的是.NET2.0),但是当我尝试3.5以上的任何东西时,它会给出-> 无法加载DLL“libvlc”:找不到指定的模块。(来自HRESULT的异常:0x8007007E) 有人做过什么解决办法来解决这个问题吗?非常感谢ppl:D:D:D:D您必须将libvlc.dll复制到您的bin/debug文件夹中。它必须是VLC安装文件夹中的文件(C:\ProgramFiles\videolan\VLC)您必须将libvlc.dll

嘿,小伙子们,姑娘们:)好吧,我开始做这个项目-> 它工作得很好(他使用的是.NET2.0),但是当我尝试3.5以上的任何东西时,它会给出-> 无法加载DLL“libvlc”:找不到指定的模块。(来自HRESULT的异常:0x8007007E)


有人做过什么解决办法来解决这个问题吗?非常感谢ppl:D:D:D:D

您必须将
libvlc.dll
复制到您的
bin/debug
文件夹中。它必须是VLC安装文件夹中的文件(
C:\ProgramFiles\videolan\VLC

您必须将
libvlc.dll
复制到
bin/debug
文件夹中。它必须是VLC安装文件夹中的一个(
C:\program files\videolan\VLC

在新的2.0.x VLC版本中使用该示例时,必须做两件事。首先,您必须以某种方式将libvlcdll添加到搜索路径中。我使用了一个调用SetDllDirectory的方法。您将其声明为:

static class LibVlc
{
    . . .
    [DllImport("kernel32.dll", SetLastError = true)]
    public static extern bool SetDllDirectory(string lpPathName);
    . . .
}
然后,您可以使用VLC安装的根文件夹调用此方法。在我的电脑上,我这样称呼它:

LibVlc.SetDllDirectory(@"C:\Program Files (x86)\VideoLAN\VLC");
显然,对于正在分发的程序,这个参数应该是可配置的

接下来,VLCAPI显然发生了变化,因为这些方法不再需要传入异常对象。看起来应该检查方法的返回值(例如,如果出现错误,libvlc_new()将返回NULL)。我没有像他那样尝试通过引用传入异常对象,但是没有它调用都可以正常工作(我的接口现在与VLCAPI完全匹配)。我还指定了执行互操作时要使用的调用约定,只是为了让运行时清楚我对参数传递顺序等的期望。例如,以下是我对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);

我希望这有帮助

在新的2.0.x VLC版本中使用该示例时,必须做两件事。首先,您必须以某种方式将libvlcdll添加到搜索路径中。我使用了一个调用SetDllDirectory的方法。您将其声明为:

static class LibVlc
{
    . . .
    [DllImport("kernel32.dll", SetLastError = true)]
    public static extern bool SetDllDirectory(string lpPathName);
    . . .
}
然后,您可以使用VLC安装的根文件夹调用此方法。在我的电脑上,我这样称呼它:

LibVlc.SetDllDirectory(@"C:\Program Files (x86)\VideoLAN\VLC");
显然,对于正在分发的程序,这个参数应该是可配置的

接下来,VLCAPI显然发生了变化,因为这些方法不再需要传入异常对象。看起来应该检查方法的返回值(例如,如果出现错误,libvlc_new()将返回NULL)。我没有像他那样尝试通过引用传入异常对象,但是没有它调用都可以正常工作(我的接口现在与VLCAPI完全匹配)。我还指定了执行互操作时要使用的调用约定,只是为了让运行时清楚我对参数传递顺序等的期望。例如,以下是我对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);

我希望这有帮助

这样做之后我得到了这个结果:调用PInvoke函数“MyLibVLC!”!LibVlc::LibVlc_new'使堆栈不平衡。这可能是因为托管PInvoke签名与非托管目标签名不匹配。检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配。自撰写该文章以来,API已更新,其中定义的调用已过期。解决方案:a)修复p/invoke定义b)下载与文章作者使用的VLC版本相同的版本。完成后我得到了这个结果:调用PInvoke函数“MyLibVLC!”!LibVlc::LibVlc_new'使堆栈不平衡。这可能是因为托管PInvoke签名与非托管目标签名不匹配。检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配。自撰写该文章以来,API已更新,其中定义的调用已过期。解决方案:a)修复p/invoke定义b)下载与文章作者使用的版本相同的VLC版本。它说clrealy“找不到指定的模块”。那么您的问题是什么?将dll添加到程序目录中。它显示clrealy“找不到指定的模块”。那么您的问题是什么?将dll添加到程序目录。