CA1901: P/Invoke 宣言はポータブルでなければなりません
TypeName |
PInvokeDeclarationsShouldBePortable |
CheckId |
CA1901 |
[カテゴリ] |
Microsoft.Portability |
互換性に影響する変更点 |
あり - P/Invoke がアセンブリの外部で参照できる場合なし – P/Invoke がアセンブリの外部で参照できない場合 |
原因
この規則では、P/Invoke の各パラメーターのサイズと戻り値が評価され、32 ビット プラットフォームおよび 64 ビット プラットフォームのアンマネージ コードにマーシャリングされたときのサイズが正しいことが検証されます。この規則の違反で最も一般的なものは、プラットフォームに依存するポインター サイズの変数が必要な場所に、固定サイズの整数を渡すことです。
規則の説明
この規則に違反する次のいずれかのシナリオで発生します。
戻り値またはパラメーターを IntPtr 型と指定しなければならないときに固定サイズの整数型と指定しています。
戻り値またはパラメーターを固定サイズの整数型と指定しなければならないときに IntPtr 型と指定しています。
違反の修正方法
この違反を修正するには、Int32 や UInt32 ではなく IntPtr または UIntPtr を使用してハンドルを表します。
警告を抑制する状況
この警告は抑制しないでください。
使用例
この規則に違反する場合を次の例に示します。
internal class NativeMethods
{
[DllImport("shell32.dll", CharSet=CharSet.Auto)]
internal static extern IntPtr ExtractIcon(IntPtr hInst,
string lpszExeFileName, IntPtr nIconIndex);
}
この例では、nIconIndex パラメーターが IntPtr と宣言されています。この型の長さは、32 ビット プラットフォームでは 4 バイト、64 ビット プラットフォームでは 8 バイトです。その後のアンマネージ宣言では、nIconIndex がすべてのプラットフォームで 4 バイトの符号なし整数となっています。
HICON ExtractIcon(HINSTANCE hInst, LPCTSTR lpszExeFileName,
UINT nIconIndex);
この規則違反を修正するには、宣言を次のように変更します。
internal class NativeMethods{
[DllImport("shell32.dll", CharSet=CharSet.Auto)]
internal static extern IntPtr ExtractIcon(IntPtr hInst,
string lpszExeFileName, uint nIconIndex);
}