CA1400:P/Invoke 進入點應該要存在
型別名稱 |
PInvokeEntryPointsShouldExist |
CheckId |
CA1400 |
分類 |
Microsoft.Interoperability |
中斷變更 |
中斷 |
原因
公用 (Public) 或保護的 (Protected) 方法會以 System.Runtime.InteropServices.DllImportAttribute 做標記。 有可能是找不到 Unmanaged 程式庫,或是方法不符合程式庫中的函式。 如果規則找不到完全如同指定的方法名稱,則會以 'A' 或 'W' 當做方法名稱的字尾,尋找方法的 ANSI 或寬字元版本。 如果找不到相符者,則規則會嘗試找出採用 __stdcall 名稱格式 (_MyMethod@12,其中 12 代表引數的長度) 的函式。 如果找不到相符者且方法名稱是以 '#' 開頭,那麼規則會搜尋函式做為序數參考,而不是名稱參考。
規則描述
沒有編譯時期檢查可供確保以 DllImportAttribute 標記的方法都位於參考的 Unmanaged DLL 中。 如果具有指定之名稱的函式不在程式庫中,或方法的引數不符合函式引數,則 Common Language Runtime 會擲回例外狀況。
如何修正違規
若要修正此規則的違規情形,請更正具有 DllImportAttribute 屬性 (Attribute) 的方法。 確定已有 Unmanaged 程式庫存在,且與包含方法的組件 (Assembly) 位於相同目錄中。 如果已有此程式庫且參考正確,則驗證方法名稱、傳回型別及引數簽章是否符合程式庫函式。
隱藏警告的時機
當 Unmanaged 程式庫與參考它的 Managed 組件位於相同目錄時,請勿隱藏這項規則的警告。 在找不到 Unmanaged 程式庫的情況下,您可以放心地隱藏這項規則的警告。
範例
下列範例顯示違反規則的型別。 在 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();
}
}