C#调用C++的dll问题

C++中的方法为api_ihuReadCurrentValue1,方法的各项参数说明如下:  //api_ihuReadCurrentValue1        //功能:查询多个标签点的实时值        //参数说明:        //long serverhandle                 in连接句柄        //int number_of_tags                 in查询点数        //char *tagnames                         in      点名字符串,以逗号拼接,如:"a,b"        //float *tagvalues                         out 数组,查询返回的值,与tagnames数组对应        //IHU_TIMESTAMP *timestampsout结构体数组,返回的时间戳        //int *tagerrs                                out数组,1-查询成功,0-查询失败        //char *retmessage                         out错误信息描述        //返回值:        //>0--IH函数返回错误        //0--成功        //<0-失败,其中-50:异常,-100:加载错误,错误信息参考retmessage 我在C#中声明该方法如下: 定义C++中的结构体: [StructLayout(LayoutKind.Sequential)]    public struct IHU_TIMESTAMP    {        public int Seconds;        public int Subseconds;    } 声明C++中的方法 [DllImport("IHAPIDLLS.dll", EntryPoint = "api_ihuReadCurrentValue1", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)] public static extern int Api_ihuReadCurrentValue1(int serverhandle, int number_of_tags, string tagnames, float[] tagvalues,IntPtr timestamps, ref int tagerrs, StringBuilder retmessage); 输出的结构体数组我用IntPtr类型,请问,C#中对应C++的类型是否正确?另外,我传入结构体数组调用该方法是这样做的:                     string[] strarr = pointStr.Split(',');                    if (strarr == null || strarr.Length <= 0)                        return "";                    int count = strarr.Length;                    //记录温度点数据的数组                    float[] floatA = new float[count];                    int size = Marshal.SizeOf(typeof(IHU_TIMESTAMP));                    IHU_TIMESTAMP[] IHU_TIMESPAN = new IHU_TIMESTAMP[count];                    //查询点数据成功与否的标志变量,1表示查询成功;0表示查询失败                    int tagerrs = 0;                    //接收查询记录的相关信息(比如查询成功、查询失败等)                    StringBuilder queryLog = new StringBuilder(15);                    IntPtr parrStudyRec = Marshal.AllocHGlobal(Marshal.SizeOf(size * count));                    int run = (int)parrStudyRec;                    for (int i = 0; i < count; i++)                    {                        //IHU_TIMESPAN[i] = new IHU_TIMESTAMP();                        Marshal.StructureToPtr(IHU_TIMESPAN[i], (IntPtr)run, true);                        run += size;                    }                      //读取输出的点数值                    int result1 = IHUOperatorClass.Api_ihuReadCurrentValue1(connectHandler, count, pointStr, floatA, parrStudyRec, ref tagerrs, queryLog); 但是执行的时候报错了:运行时遇到了错误。此错误的地址为 0x663af09d,在线程 0x16c0 上。错误代码为 0xc0000005。此错误可能是 CLR 中的 bug,或者是用户代码的不安全部分或不可验证部分中的 bug。此 bug 的常见来源包括用户对 COM-interop 或 PInvoke 的封送处理错误,这些错误可能会损坏堆栈。   请问,我在C#中声明的方法对吗?如果声明的参数没有问题,那我封送结构体数组有问题吗? 由于我是第一次处理这种平台调用的问题,所以找了好几天的资料都没有解决好,在这里,我希望能得到各位的帮助。谢谢!
米琪卡哇伊
浏览 516回答 2
2回答

森栏

C++ H 头文件  在c#中要封装成Stuct  还有C++里的一些类型 要注意哈。IntPtr 对应指针 Marshal 类库中有很多方法。。查查帮助文档。、。

慕莱坞森

问题解决了嘛,也遇到了不知道什么原因啊
打开App,查看更多内容
随时随地看视频慕课网APP