C#调用C++ dll的参数转换问题,如何转换char **类型的参数到C#

这是C++代码
DLL_API int Onvif_Discovery(char** deviceaddress, int* nDevices);

这是C#调用
[DllImport("OnvifDll.dll",EntryPoint="Onvif_Discovery",
CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]
public extern static int Onvif_Discovery(out IntPtr deviceAddr, ref int nDevices);

其中deviceAddr的参数我试过ref string,string,stringbulider,都报错,尝试读写受保护的内存。

初学C#的妹子一枚,希望哪位有经验的C#大神给予解答!万分感激!!!

c#

3个回答

用fixed创建固定缓冲区,传入指针,参考
https://msdn.microsoft.com/zh-cn/library/f58wzh21.aspx

u012895911
会学习的猪 关键是那个二级指针不知道怎么传过来,能不能给我例子
接近 5 年之前 回复
 [DllImport("OnvifDll.dll",CharSet=CharSet.Ansi)]
        public extern static int Onvif_Discovery(ref IntPtr deviceAddr, ref int nDevices);

                private void button1_Click(object sender, EventArgs e)
        {
            int size=Marshal.SizeOf(typeof(char));
            IntPtr ptr = Marshal.AllocHGlobal(size);
            int num = 0;
            try
            {
                Onvif_Discovery(ref ptr, ref num);
                string str = Marshal.PtrToStringAnsi(ptr);
                MessageBox.Show(str);
            }
            finally
            {
                Marshal.FreeHGlobal(ptr);
            }

        }

我这样写的总是报错,尝试读取或写入受保护的内存。请各位帮忙看看哪里出问题了

楼主,你有解决这个问题吗

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问