我尝试通过P / Invoke调用FFMPEG方法
int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options);
所以我的P / Invoke方法定义如下:
[DllImport("avformat-55", EntryPoint = "avformat_find_stream_info", CallingConvention = CallingConvention.Cdecl)]
public extern static int AVFormatFindStreamInfo(IntPtr ic, ref IntPtr options);
我需要传递一个IntPtr.Zero选项,所以我这样说:
var p = IntPtr.Zero;
rst = AVFormatFindStreamInfo(context, ref p);
并抛出AccessViolation异常。
但是当我从签名中删除ref并直接将IntPtr.Zero传递给它时,它确实有效。 我认为使用ref关键字的签名是正确的方式,但我不知道为什么异常会抛出。
答案 0 :(得分:0)
您无法使用
执行此操作ref IntPtr options
这也会将IntPtr
变量的地址传递给非托管代码。该地址永远不会是NULL
。如果您需要能够将NULL
传递给非托管代码,则必须
IntPtr options
你通过了IntPtr.Zero
。
您可以使用两个重载执行此操作。一个就像你想要接收一个选项对象时的那个,以及一个如你没有那样的答案。或者,您可以使用单个重载,即此答案中的版本,并在需要接收选项变量时手动固定IntPtr
变量。