问题描述
c#调用c++api函数之参数类型问题c++函数定义如下extern"C"{structcolorstruct{doubledbValueInterval;CStringstr;IColorPtripColor;colorstruct(){str=_T("");dbValueInterval=0.0;ipColor.CreateInstance(CLSID_RgbColor);}};__declspec(dllexport)voidCressmantestforSK(inta,intirad,float*rads,intisiz,intjsiz,floatdbCellSize,doublelnmin,doublelnmax,doubleltmin,doubleltmax,longstnnum,float*stnlon,float*stnlat,float*stnrpt,float*grid,colorstruct*colorArray,intiLineNum,floatNoDefineVale);}C#中extern如下[DllImport("CressmanforSk24.dll")]publicexternstaticvoidCressmantestforSK(//__declspec(dllexport)voidCressmantestforSK(inta,//inta,intirad,//intirad,Single[]rads,//Single*rads,intisiz,//intisiz,intjsiz,//intjsiz,SingledbCellSize,//SingledbCellSize,doublelnmin,//doublelnmin,doublelnmax,//doublelnmax,doubleltmin,//doubleltmin,doubleltmax,//doubleltmax,longstnnum,//longstnnum,Single[]stnlon,//Single*stnlon,Single[]stnlat,//Single*stnlat,Single[]stnrpt,//Single*stnrpt,outSingle[]grid,//Single*grid,colorstruct[]colorArray,//colorstruct*colorArray,intiLineNum,//intiLineNum,SingleNoDefineVale//SingleNoDefineVale);//);publicstructcolorstruct{///<summary>///数值///</summary>[MarshalAs(UnmanagedType.R8)]publicdoubledbValueInterval;//=0;///<summary>///名称///</summary>[MarshalAs(UnmanagedType.LPStr)]publicstringstr;//=""///<summary>///颜色///</summary>[MarshalAs(UnmanagedType.Interface)]publicIColoripColor;//=newRgbColorClass()//voidcolorstruct()//{//str=_T("");//dbValueInterval=0.0;//ipColor.CreateInstance(CLSID_RgbColor);//}};报错:尝试读取或写入受保护的内存,内存已损坏初步确定是参数类型对应的问题,谁能帮帮我啊msn:jpu_jacky@eyou.com
解决方案
解决方案二:
[StructLayout(LayoutKind.Sequential)]publicstructcolorstruct{...}
解决方案三:
有精通的朋友加我msn,做arcgis二次开发的更好,先谢谢大家了
解决方案四:
up
解决方案五:
帮顶
解决方案六:
两星都只能帮顶啊?谁精通的给我们菜鸟上一课吧~
解决方案七:
那有个CString啊
解决方案八:
估计是这样voidCressmantestforSK(inta,intirad,reffloatrads,intisiz,intjsiz,floatdbCellSize,doublelnmin,doublelnmax,doubleltmin,doubleltmax,longstnnum,reffloatstnlon,reffloatstnlat,reffloatstnrpt,reffloatgrid,IntPtrcolorArray,intiLineNum,floatNoDefineVale);
colorArray参数通过Marshal.UnsafeAddrOfPinnedArrayElement();
得到初始地址
解决方案九:
考虑一下是否是字节边界对齐问题.尝试一下调整Layout的对齐大小
解决方案十:
不好翻译的类型(指针)先用IntPtr代替,先把接口调试通过再想办法structcolorstruct{publicdoubledbValueInterval;publicIntPtrstr;publicIntPtripColor;}
解决方案十一:
我要上笨办法了一个个类型来调等我搞明白了告诉大家
解决方案十二:
帮顶