ASP.Net中的SafeHandle类可用于管理外部资源,如文件句柄、内存句柄等。下面是一些使用SafeHandle的示例:
public class FileSafeHandle : SafeHandleZeroOrMinusOneIsInvalid
{
private readonly string _fileName;
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
private static extern IntPtr CreateFile(
string lpFileName,
FileAccess dwDesiredAccess,
FileShare dwShareMode,
IntPtr lpSecurityAttributes,
FileMode dwCreationDisposition,
FileAttributes dwFlagsAndAttributes,
IntPtr hTemplateFile);
public FileSafeHandle(string fileName)
: base(true)
{
_fileName = fileName;
handle = CreateFile(fileName, FileAccess.ReadWrite, FileShare.ReadWrite, IntPtr.Zero,
FileMode.Open, FileAttributes.RandomAccess, IntPtr.Zero);
if (handle == IntPtr.Zero || handle == new IntPtr(-1))
{
int lastWin32Error = Marshal.GetLastWin32Error();
throw new Win32Exception(lastWin32Error, "Failed to open file");
}
}
protected override bool ReleaseHandle()
{
return NativeMethods.CloseHandle(handle);
}
public string FileName => _fileName;
}
在使用FileSafeHandle时,只需像使用一般的文件句柄一样使用即可,无需手动释放句柄。
public class MemorySafeHandle : SafeHandleZeroOrMinusOneIsInvalid
{
private readonly long _memorySize;
[DllImport("kernel32.dll", SetLastError = true)]
private static extern IntPtr VirtualAlloc(IntPtr lpAddress, UIntPtr dwSize,
AllocationType flAllocationType, MemoryProtection flProtect);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool VirtualFree(IntPtr lpAddress, UIntPtr dwSize,
FreeType dwFreeType);
public MemorySafeHandle(long memorySize)
: base(true)
{
_memorySize = memorySize;
handle = VirtualAlloc(IntPtr.Zero, new UIntPtr((ulong)memorySize),
Allocation