gpt4 book ai didi

c# - HANDLE (IntPtr) 已过时,kernel32.dll,SafeFileHandle 到 IntPtr

转载 作者:行者123 更新时间:2023-11-30 01:44:11 30 4
gpt4 key购买 nike

我需要实现一个与找到的解决方案非常相似的解决方案 here ,写于 2009 年,用于检索文件的唯一标识符。具体来说,我正在查看答案的 ApproachB()函数和以下行(重写了一点以反射(reflect)新的 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映射到 extern从“kernel32.dll”导入的函数。其中签名如下:

[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool GetFileInformationByHandle(IntPtr hFile, out BY_HANDLE_FILE_INFORMATION lpFileInformation);

输入 IntPtr很好地映射到上面链接文档中的指定类型 HANDLE .然而,Handle属性(property) FileStream objects 已被弃用(制成 obsolete )并替换为 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 中实现,该基类正是为此目的而创建的。

关于c# - HANDLE (IntPtr) 已过时,kernel32.dll,SafeFileHandle 到 IntPtr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36580446/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com