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

时间:2016-04-12 17:42:49

标签: c# c++ .net dll

我需要实现一个与2009年编写的here非常相似的解决方案,以检索文件的唯一标识符。具体来说,我正在查看答案的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很好地映射到上面链接的doc.s HANDLE中的指定类型。但是,Handle对象上的FileStream属性已被弃用(obsolete}并替换为SafeFileHandle,其中映射到{{ 1}}。

有没有办法克服这个问题,IntPtr定义可以接受类型extern?或者,是否有为此目的实施的另一个SafeFileHandle方法?

1 个答案:

答案 0 :(得分:4)

将您的PInvoke签名更改为

select distinct
    store_type
from
    stores
where
    not exists (
                    select *
                    from
                        cities
                    where
                        not exists (
                                        select *
                                        from
                                            cities_stores
                                        where
                                            cities_stores.city = cities.city
                                            and cities_stores.store_type = stores.store_type
                                    )
               );

或保留它并在您的SafeFileHandle实例上调用方法.DangerousGetHandle(),它将返回您正在搜索的IntPtr。此方法在基类SafeHandle中实现,该类基于此目的而制作。