111,126
社区成员
发帖
与我相关
我的任务
分享class Program
{
public const int tagMac_BytesCount = 64;
public const int tagCoordinate_BytesCount = 32;
public const int tagAll_BytesCount = tagMac_BytesCount + tagCoordinate_BytesCount;
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
public struct TAG_INFO
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = tagMac_BytesCount)]
public String tagMac;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = tagCoordinate_BytesCount)]
public String tagCoordinate;
}
//定义一个与非直接复制到本机结构中的类型具有相同大小的可直接复制到本机结构中的帮助器类型
//并在平台调用函数返回后转化数据
[StructLayout(LayoutKind.Explicit)]
public struct MARSHAL_TAG_INFO
{
[FieldOffset(0)]
public Byte byteStart;
[FieldOffset(tagAll_BytesCount - 1)] //强制结构大小
public Byte byteEnd;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct RSSI_INFO
{
public Int16 nRSSI;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string strCoordinate;
}
public class LibWrap
{
[DllImport("MyDll.dll", CharSet = CharSet.Ansi)]
public static extern MARSHAL_TAG_INFO GetCoordinateByTagsRssi(String tagMac, Int16 inAPCount, [In, Out] RSSI_INFO[] pRssiInfo);
}
static void Main(string[] args)
{
TAG_INFO result;
MARSHAL_TAG_INFO resultTemp;
RSSI_INFO[] test = new RSSI_INFO[3];
test[0].nRSSI = 5;
test[1].nRSSI = 5;
test[2].nRSSI = 5;
test[0].strCoordinate = "x:0,y:5";
test[1].strCoordinate = "x:5,y:0";
test[2].strCoordinate = "x:10,y:5";
String tagmac = "AAAA";
Int16 m = 3;
resultTemp = LibWrap.GetCoordinateByTagsRssi(tagmac, m, test);
//利用非托管内存转化数据。效率不高,或有更好的方法
IntPtr pointer = Marshal.AllocCoTaskMem(tagAll_BytesCount);
Marshal.StructureToPtr(resultTemp, pointer, true);
result.tagMac = Marshal.PtrToStringAnsi(pointer, tagMac_BytesCount);
result.tagCoordinate = Marshal.PtrToStringAnsi(pointer + tagMac_BytesCount, tagCoordinate_BytesCount);
Marshal.FreeCoTaskMem(pointer);
Console.WriteLine("【{0}】,【{1}】", result.tagMac.Trim((char)0), result.tagCoordinate.Trim((char)0));
Console.ReadKey();
}
}public static extern TAG_INFO GetCoordinateByTagsRssi(byte[] tagMac, Int16 inAPCount, RSSI_INFO[] pRssiInfo);这样的声明是没有问题的吧
jieguo = GetCoordinateByTagsRssi(tagmac, m, test);//这样的调用也OK吗?