c#指针exp~
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace CSharp指针
{
class Tester
{
static void Main(string[] args)
{
APIFileReader fileReader = new APIFileReader("myTestFile.txt");
const int BuffSize = 128;
byte[] buffer = new byte[BuffSize];
ASCIIEncoding asciiEncoder = new ASCIIEncoding();
while (fileReader.Read(buffer, 0, BuffSize) != 0)
{
Console.WriteLine("{0}",asciiEncoder.GetString(buffer));
}
Console.ReadKey();
}
}
class APIFileReader
{
const uint GenericRead = 0x80000000;
const uint OpenExisting = 3;
const uint UseDefault = 0;
int fileHandle;
[DllImport("kernel32", SetLastError = true)]
static extern unsafe int CreateFile(
string filename,
uint desiredAccess,
uint shareMode,
uint attributes,
uint creationDisposition,
uint flagsAndAttributes,
uint templateFile);
[DllImport("kernel32", SetLastError = true)]
static extern unsafe bool ReadFile(
int hFile,
void* lpBuffer,
int nBytesToRead,
int* nBytesRead,
int overlapped
);
//类APIFileReader的构造函数打开要读取的文件,并将运行结果赋值给成员函数fileHandle
public APIFileReader(string filename)
{
fileHandle = CreateFile(
filename,
GenericRead,
UseDefault,
UseDefault,
OpenExisting,
UseDefault,
UseDefault);
}
public unsafe int Read(byte[] buffer, int index, int count)
{
int bytesRead = 0;
fixed (byte* bytesPointer = buffer)
{
ReadFile(
fileHandle,
bytesPointer + index,
count,
&bytesRead,
0);
}
return bytesRead;
}
}
}
因为WIndowsAPI的ReadFile函数的第2个参数是指针,所以要用到指针~~~~~
------解决方案--------------------
//1
[DllImport("kernel32.dll")]
static extern bool ReadFile(IntPtr hFile, byte[] lpBuffer,
uint nNumberOfBytesToRead, out uint lpNumberOfBytesRead, IntPtr lpOverlapped);
or
//2
[DllImport("kernel32.dll", SetLastError=true)]
static extern unsafe int ReadFile(IntPtr handle, IntPtr bytes, uint numBytesToRead,
IntPtr numBytesRead, NativeOverlapped* overlapped);
or
//3
[DllImport("kernel32.dll", SetLastError=true)]
static extern bool ReadFile(IntPtr hFile, [Out] byte[] lpBuffer, uint nNumberOfBytesToRead,
out uint lpNumberOfBytesRead, [In] ref System.Threading.NativeOverlapped lpOverlapped);
or
//4
[DllImport("kernel32.dll"