C# 不推荐用指针,但可以使用指针,同时在某些情况下又不得不使用指针,比如C#调用了C++的DLL,而经常会用到指针
下在介绍C#代码中使用指针:
1,首先要使用指针,先在要C#工程属性中设置 ( 右键工程名 -》属性-》生成 ) ”允许不安全代码“:
2,添加 引用 using System.IO;
3,工程中用到指针的针码段用 unsafe{ } 包住,如下:
unsafe
{
fixed ( byte* p = &buf )
{
using (UnmanagedMemoryStream ms = new UnmanagedMemoryStream((byte*)p, size, size, FileAccess.Read))
{
ms.Read(tbuf, 0, tbuf.Length);
}
}
}
4,设置 UnmanagedMemoryStream 的读写权限:FileAccess.Read ,FileAccess.Write ,FileAccess.ReadWrite 三种
如,从指针中读取内容到 Byte [] tbuf数组中。
using (UnmanagedMemoryStream ms = new UnmanagedMemoryStream((byte*)p, size, size, FileAccess.Read))
{
ms.Read(tbuf, 0, tbuf.Length);
}
往指针中读写入 Byte [] tbuf数组中 内容。
using (UnmanagedMemoryStream ms = new UnmanagedMemoryStream((byte*)p, size, size, FileAccess.ReadWrite))
{
ms.Write(tbuf, 0, size);
}
5,给下完整的实现例子
public void write(ref Byte buf, Byte size)
{
Byte[] tbuf = new Byte[size];
unsafe
{
fixed ( byte* p = &buf )
{
using (UnmanagedMemoryStream ms = new UnmanagedMemoryStream((byte*)p, size, size, FileAccess.Read))
{
ms.Read(tbuf, 0, tbuf.Length);
}
}
}
serialPort1.Write(tbuf, 0, size);
return;
}
public Byte read(ref Byte buf, Byte size, Byte mstimeout)
{
Byte[] tbuf = new Byte[10];
DateTime now = DateTime.Now;
int s,rc;
do
{
rc = serialPort1.Read(tbuf, 0, size);
if (rc == size)
{
unsafe
{
fixed ( byte* p = &buf )
{
using (UnmanagedMemoryStream ms = new UnmanagedMemoryStream((byte*)p, size, size, FileAccess.ReadWrite))
{
ms.Write(tbuf, 0, size);
}
}
}
ServoTest.Text = string.Format("{0:X02} {1:X02} {2:X02} {3:X02} {4:X02} {5:X02} {6:X02} {7:X02} {8:X02} {9:X02} ",
tbuf[0], tbuf[1], tbuf[2], tbuf[3],tbuf[4],tbuf[5],tbuf[6],tbuf[7],tbuf[8],tbuf[9]);
return 0;
}
TimeSpan spand = DateTime.Now - now;
s = spand.Milliseconds;
}while (s < mstimeout);
return 1;
}