[英]HANDLE (IntPtr) Obsolete, kernel32.dll, SafeFileHandle to IntPtr
我需要执行非常相似的一个发现了一个解决方案在这里 ,写在2009年,检索文件的唯一标识符。 具体来说,我正在查看答案的ApproachB()
函数和以下行(将其重写一下以反映新的C#功能):
var fi = new FileInfo(@"C:\Temp\testfile.txt");
var fs = fi.Open(FileMode.Open,FileAccess.Read,FileShare.ReadWrite);
WinAPI.GetFileInformationByHandle(fs.Handle, out objectFileInfo); // fs.Handle being the portion in question
这里的问题是GetFileInformationByHandle映射到从“ kernel32.dll”导入的extern
函数。 其签名如下:
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool GetFileInformationByHandle(IntPtr hFile, out BY_HANDLE_FILE_INFORMATION lpFileInformation);
类型IntPtr
可以很好地映射到上面链接的文档HANDLE
的指定类型。 但是, FileStream
对象的Handle
属性已被弃用( 作废 ),并替换为SafeFileHandle
,后者没有映射到IntPtr
。
有没有一种方法可以解决这个问题,使得extern
定义可以接受SafeFileHandle
类型? 还是为此目的实施了另一种extern
方法?
将您的PInvoke签名更改为
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool GetFileInformationByHandle(SafeFileHandle hFile, out BY_HANDLE_FILE_INFORMATION lpFileInformation);
或保留它并在您的SafeFileHandle实例上调用.DangerousGetHandle()方法,该方法将返回您要搜索的IntPtr。 该方法在为此目的而创建的基类SafeHandle中实现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.