【发布时间】:2012-04-28 09:32:50
【问题描述】:
这段代码:
[DllImport("shell32", CharSet=CharSet.Unicode)]
private static extern int SHGetFileInfo(string pszPath, uint dwFileAttributes, out SHFILEINFO psfi, uint cbFileInfo, uint flags);
导致以下代码分析问题:
CA1901 P/Invoke 声明应该是可移植的
正如您在代码中声明的那样,P/Invoke 的返回类型 'IconUtil.SHGetFileInfo(string, uint, out IconUtil.SHFILEINFO, uint, uint)' 在 64 位平台上将是 4 字节宽。这是不对的, 因为这个 API 的实际本机声明表明它应该是 8 64 位平台上的字节宽。查阅 MSDN 平台 SDK 帮助确定应使用哪种数据类型的文档 而不是“int”。
我该怎么办?我试过“咨询 MSDN”,但我不确定这个问题到底意味着什么。
我也在同一行得到这个:
CA1060 将 P/Invokes 移至 NativeMethods 类
因为是 P/Invoke 方法,所以 'IconUtil.SHGetFileInfo(string, uint, out IconUtil.SHFILEINFO, uint, uint)' 应该在一个类中定义 命名为 NativeMethods、SafeNativeMethods 或 UnsafeNativeMethods。
【问题讨论】:
-
您声明
SHGetFileInfo为返回int。SHGetFileInfo是否返回int?根据 MSDN,它没有。在 x86 上,它已经足够接近了。在 x64 上,它不是。这就是第一条消息的内容。 -
如有疑问,请查看 Pinvoke.Net - 他们通常会正确签名 - SHGetFileInfo。当然,如果他们确实弄错了签名,回馈也很好,但我认为在这种情况下他们是正确的。
-
CA1060 非常清楚:您已将方法声明放在名为
IconUtil的类中,但它应该放在名为NativeMethods、SafeNativeMethods或UnsafeNativeMethods的类中.查看 MSDN 以了解您应该使用这三个中的哪一个。