Csharp/C#教程:正确调用非托管DLL函数的约定分享


正确调用非托管DLL函数的约定

我正在尝试为LibVLC DLL库编写一个简单的超简单轻量级包装器。 我不需要访问太多,只需要播放暂停和停止媒体文件的能力。 我正在查看文档和我发现的其他链接解释了旧版本的LibVLC,但它已经过时了最新版本。 我也试过LibVLC.Net,但它也已经过时了,我找不到我在源代码中寻找的内容,以便将它与我想要导出的函数相匹配。

我有以下签名我正试图导出:

libvlc_new (int argc, const char *const *argv) 

说明:

 argc the number of arguments (should be 0) argv list of arguments (should be NULL) 

这就是我正在尝试的方法。

 [DllImport("libvlc", EntryPoint = "libvlc_new")] public static extern IntPtr New(Int32 argc, String[] argv); 

描述表明它应该是一个数组,我认为问题是第二个参数。 我试过了:

 [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)] String[] argv 

根据这里的说法,还有一些其他的选项,比如这里建议的String和StringBuilder,但是每当我调用函数时我仍然会遇到Imbalanced PInvoke堆栈。

我需要知道什么是正确的调用约定,很可能是其他几个函数。 “PInvoke For Dummies”在线参考将是非常好的。

如果只允许NULL则声明参数类型没什么意义。 只需将其声明为IntPtr并传递IntPtr.Zero即可。

调试器指出你忘了声明CallingConvention。 它不是.NET的默认设置,这是一个__cdecl函数。 所以适当的声明是:

 [DllImport("libvlc", EntryPoint = "libvlc_new", CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr New(int argc, IntPtr argv); 

被称为:

 New(0, IntPtr.Zero); 

试着选择一个更好的免费精选名字大全……

上述就是C#学习教程:正确调用非托管DLL函数的约定分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1020371.html

(0)
上一篇 2022年1月5日
下一篇 2022年1月5日

精彩推荐