このコード:この「P/Invoke宣言は移植可能でなければならない」をどのように解決すればよいですか?
[DllImport("shell32", CharSet=CharSet.Unicode)]
private static extern int SHGetFileInfo(string pszPath, uint dwFileAttributes, out SHFILEINFO psfi, uint cbFileInfo, uint flags);
には、次のコード分析の問題が発生します。それはあなたのコード、戻り値の型で宣言されたよう
CA1901 P /呼び出し宣言は
移植する必要がありますP/Invoke 'IconUtil.SHGetFileInfo(string、uint、out IconUtil.SHFILEINFO、uint、 uint)'は、64ビットプラットフォームで4バイト幅になります。これは正しくありません。 は、このAPIの実際のネイティブ宣言として、64ビットプラットフォームでは8 バイトの幅であることを示しています。 「int」の代わりに を使用する必要があるデータ型を判断するためのヘルプは、MSDN Platform SDK のドキュメントを参照してください。
私は何をすべきですか?私は "consulting MSDN"を試みましたが、問題が何を意味するのかは分かりません。
私はまた、同じ行のためにこれを取得する:それはP/Invokeメソッドであるため
CA1060の移動Pは/(IconUtil.SHGetFileInfo」、NativeMethodsクラスに
を呼び出しますstring、uint、 、out IconUtil.SHFILEINFO、uint、uint) 'は、NativeMethods、SafeNativeMethods、またはUnsafeNativeMethodsという名前のクラス に定義する必要があります。
'SHGetFileInfo'を' int'を返すと宣言しました。 'SHGetFileInfo'は' int'を返しますか? MSDNによると、それはしません。 x86では十分です。 x64では、そうではありません。それが最初のメッセージについてです。 – hvd
疑問がある場合は、Pinvoke.Netをチェックしてください。通常、署名の権利があります。[SHGetFileInfo](http://www.pinvoke.net/default.aspx/shell32.shgetfileinfo)。もちろん、彼らが署名を間違えた場合、それはまた貢献することは良いですが、私は彼らがこの場合正しいと思います。 –
[CA1060](http://msdn.microsoft.com/en-us/library/ms182161.aspx)はかなり明確です。メソッド宣言を 'IconUtil'という名前のクラスに配置しましたが、 'NativeMethods'、' SafeNativeMethods'、または 'UnsafeNativeMethods'という名前のクラスです。 3つのうちどれを使用すべきかをMSDNで確認してください。 – dtb