此代码:
[DllImport("shell32", CharSet=CharSet.Unicode)]
private static extern int SHGetFileInfo(string pszPath, uint dwFileAttributes, out SHFILEINFO psfi, uint cbFileInfo, uint flags);造成下列代码分析问题:
CA1901 P/Invoke声明应该是可移植的
正如在代码中声明的那样,在64位平台上,P/Invoke 'IconUtil.SHGetFileInfo(string,uint,out IconUtil.SHFILEINFO,uint,uint)的返回类型将是4个字节宽。这是不正确的,因为这个API的实际本机声明表明它应该在64位平台上宽8字节。请参阅MSDN文档,以确定应该使用什么数据类型而不是“int”。
我该怎么做?我试过“咨询MSDN",但我不太清楚这个问题到底意味着什么。
我还得到了同一行的这个:
CA1060将P调用到NativeMethods类
由于IconUtil.SHGetFileInfo是一个P/Invoke方法,所以应该在一个名为NativeMethods、SafeNativeMethods或UnsafeNativeMethods.的类中定义‘NativeMethods(string,uint,out IconUtil.SHFILEINFO,uint,uint)’。
发布于 2012-04-28 12:54:09
警告所引用的MSDN页面是本机函数SHGetFileInfo的文档。它的签名如下:
DWORD_PTR SHGetFileInfo(
__in LPCTSTR pszPath,
DWORD dwFileAttributes,
__inout SHFILEINFO *psfi,
UINT cbFileInfo,
UINT uFlags
);因此,第一个警告是指DWORD_PTR是一个指针大小为无符号整数的事实。这意味着您应该使用UIntPtr。
下一个跳出的事情是SHFILEINFO结构被表示为__inout。这意味着您需要通过ref传递它。
因此,p/invoke声明应该是:
[DllImport("shell32", CharSet=CharSet.Unicode)]
private static extern UIntPtr SHGetFileInfo(
string pszPath,
uint dwFileAttributes,
ref SHFILEINFO psfi,
uint cbFileInfo,
uint flags
);最后的警告很容易解决。只需将p/invoke声明放在名为NativeMethods的类中即可。
发布于 2012-04-28 10:08:21
我通过将int的返回类型更改为IntPtr来解决第一个问题。
https://stackoverflow.com/questions/10362289
复制相似问题