首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解决这个"P/Invoke声明应该是可移植的“?

如何解决这个"P/Invoke声明应该是可移植的“?
EN

Stack Overflow用户
提问于 2012-04-28 09:32:50
回答 2查看 3.3K关注 0票数 3

此代码:

代码语言:javascript
复制
[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)’。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-28 12:54:09

警告所引用的MSDN页面是本机函数SHGetFileInfo的文档。它的签名如下:

代码语言:javascript
复制
DWORD_PTR SHGetFileInfo(
  __in     LPCTSTR pszPath,
  DWORD dwFileAttributes,
  __inout  SHFILEINFO *psfi,
  UINT cbFileInfo,
  UINT uFlags
);

因此,第一个警告是指DWORD_PTR是一个指针大小为无符号整数的事实。这意味着您应该使用UIntPtr

下一个跳出的事情是SHFILEINFO结构被表示为__inout。这意味着您需要通过ref传递它。

因此,p/invoke声明应该是:

代码语言:javascript
复制
[DllImport("shell32", CharSet=CharSet.Unicode)]
private static extern UIntPtr SHGetFileInfo(
    string pszPath, 
    uint dwFileAttributes, 
    ref SHFILEINFO psfi, 
    uint cbFileInfo, 
    uint flags
);

最后的警告很容易解决。只需将p/invoke声明放在名为NativeMethods的类中即可。

票数 4
EN

Stack Overflow用户

发布于 2012-04-28 10:08:21

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10362289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档