问题描述
大家好,我现在处理的是一个仪器控制的编程,用c#(c++不太熟悉,不然就可以直接用c++编程了)。是调用dll中的两个函数:shortOOI_Flexible_Acquisition(OOI_FAM_PARAM*fp);shortOOI_FullScan(FULLPARAM*fp);OOI_FAM_PARAM和FULLPARAM是两个结构体,其中FULLPARAM中还含有一个指针数组;structFULLPARAM{shortcmd[8];shortfdc[8];worddsf[8];shortboxcar[8];shortaverage[8];shortscan_dark[8];shortcorrect_dark[8];shortextrig[8];float*chdat[8];//指向仪器获得的数据保存位置,0-7代表八个通道,每个通道对应2048像素点的光强}而指针*chdat[i]是指向一个2048大小的数组。现在要在c#中成功调用这两个函数,获得保存在数组中的值该怎么弄呢?OOI_FAM_PARAM结构中没有数组,我直接这样导入和调用的,可以吗?[DllImport("OOIDRV32.DLL")]publicstaticexternshortOOI_Flexible_Acquisition(refOOI_FAM_PARAMfp);调用:OOI_FAM_PARAMstr;OOI_Flexible_Acquisition(refstr);
解决方案
解决方案二:
[StructLayout(LayoutKind.Sequential)]publicstructFULLPARAM{[MarshalAs(UnmanagedType.ByValArray,SizeConst=8)]publicInt16[]cmd;[MarshalAs(UnmanagedType.ByValArray,SizeConst=8)]publicInt16[]fdc;[MarshalAs(UnmanagedType.ByValArray,SizeConst=8)]publicInt16[]dsf;[MarshalAs(UnmanagedType.ByValArray,SizeConst=8)]publicInt16[]boxcar;[MarshalAs(UnmanagedType.ByValArray,SizeConst=8)]publicInt16[]average;[MarshalAs(UnmanagedType.ByValArray,SizeConst=8)]publicInt16[]scan_dark;[MarshalAs(UnmanagedType.ByValArray,SizeConst=8)]publicInt16[]correct_dark;[MarshalAs(UnmanagedType.ByValArray,SizeConst=8)]publicInt16[]extrig;[MarshalAs(UnmanagedType.ByValArray,SizeConst=8*2048)]publicfloat[]chdat;}
调用时候一定使用ref
解决方案三:
楼上数得对
解决方案四:
谢谢啊,c++中的word和short都对应int16吗?还有那个publicfloat[]chdat;声明是一维的,大小定义的却是8*2048;比如我想创建一个新的数组float[,]TSMUL=newfloat[8,2048];该怎么把chdat中的值转到TSMUL中,chdal[i]应该是对用的每一个通道数据存储的地址吧?我按你的方法试了一下,OOI_FullScan(refstr);调试程序语法没错误,运行时显示:无法封送处理“parameter#1”:内部限制:结构太复杂或太大。
解决方案五:
引用1楼isjoe的回复:
C#code[StructLayout(LayoutKind.Sequential)]publicstructFULLPARAM{[MarshalAs(UnmanagedType.ByValArray,SizeConst=8)]publicInt16[]cmd;……
指针没那么恐怖吧。、