3

这段代码:

[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 的实际本机声明表明它在 64 位平台上应该是 8 字节宽。请参阅 MSDN 平台 SDK 文档以帮助确定应使用什么数据类型而不是“int”。

我应该做些什么?我试过“咨询 MSDN”,但我不确定这个问题是什么意思。


我也为同一行得到这个:

CA1060 将 P/Invokes 移至 NativeMethods 类

因为它是一个 P/Invoke 方法,所以应该在名为 NativeMethods、SafeNativeMethods 或 UnsafeNativeMethods 的类中定义“IconUtil.SHGetFileInfo(string, uint, out IconUtil.SHFILEINFO, uint, uint)”。

4

2 回答 2

4

警告所指的 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-28T12:54:09.723 回答
0

int我通过将返回类型更改为to解决了第一个问题IntPtr

于 2012-04-28T10:08:21.773 回答