CA1400: P/Invoke エントリ ポイントは存在しなければなりません
TypeName |
PInvokeEntryPointsShouldExist |
CheckId |
CA1400 |
[カテゴリ] |
Microsoft.Interoperability |
互換性に影響する変更点 |
なし |
原因
パブリック メソッドまたはプロテクト メソッドが System.Runtime.InteropServices.DllImportAttribute でマークされています。アンマネージ ライブラリの位置を特定できないか、メソッドがライブラリ内の関数と一致しません。指定どおりの正確なメソッド名が見つからない場合、メソッド名の末尾に "A" または "W" と追加して、メソッドの ANSI バージョンまたはワイド文字バージョンが検索されます。一致するものが見つからない場合、__stdcall (たとえば "_MyMethod@12"、ここで 12 は引数の長さを表します) という名前の形式で関数の特定が試行されます。一致するものが見つからず、メソッド名が "#" で始まる場合、名前の参照ではなく、序数の参照として関数が検索されます。
規則の説明
DllImportAttribute でマークされたメソッドが、参照されたアンマネージ DLL に含まれていることを確認するための、コンパイル時のチェックはありません。指定した名前の関数がライブラリに含まれていない場合、またはメソッドに対する引数が関数の引数と一致しない場合、共通言語ランタイムから例外がスローされます。
違反の修正方法
この規則違反を修正するには、DllImportAttribute 属性を含むメソッドを修正します。アンマネージ ライブラリが存在し、メソッドを含むアセンブリと同じディレクトリにあることを確認します。ライブラリが存在し、正しく参照されている場合、メソッド名、戻り値の型、および引数のシグネチャがライブラリ関数と一致することを確認します。
警告を抑制する状況
アンマネージ ライブラリが、そのアンマネージ ライブラリを参照するマネージ アセンブリと同じディレクトリにある場合は、この規則による警告を抑制しないでください。アンマネージ ライブラリの位置を特定できない場合は、この規則による警告を抑制しても安全なこともあります。
使用例
この規則に違反する型を次の例に示します。kernel32.dll に DoSomethingUnmanaged という名前の関数はありません。
using System.Runtime.InteropServices;
namespace InteroperabilityLibrary
{
public class NativeMethods
{
// If DoSomethingUnmanaged does not exist, or has
// a different signature or return type, the following
// code violates rule PInvokeEntryPointsShouldExist.
[DllImport("kernel32.dll")]
public static extern void DoSomethingUnmanaged();
}
}