共用方式為


P/Invoke 進入點應該要存在

更新:2007 年 11 月

型別名稱

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();
   }
}

請參閱

參考

System.Runtime.InteropServices.DllImportAttribute