Sdílet prostřednictvím


CA1400: Vstupní body P/Invoke by existovat.

TypeName

PInvokeEntryPointsShouldExist

CheckId

CA1400

Kategorie

Microsoft.interoperability

Narušující změna

Nenarušující

Příčina

Veřejná nebo chráněná metoda je označena atributem System.Runtime.InteropServices.DllImportAttribute.Nespravovanou knihovnu nelze nalézt, nebo nelze metodu porovnat s funkcí v knihovně.Jestliže nelze metodu přesně podle specifikace nalézt, vyhledá ANSI verzi nebo verzi pro široké znaky metody s příponou "A" případně "W".Jestliže nebude nalezena žádná shoda, pravidlo se pokusí funkci najít pomocí formátu názvu __stdcall (_MyMethod@12, kde 12 představuje délku argumentů).Pokud nebude nalezena žádná shoda a název metody začíná na "#", bude pravidlo vyhledávat funkci jako řadový odkaz namísto jmenného odkazu.

Popis pravidla

Neexistuje žádná kontrola během kompilace, která by zajistila, že metody označené atributem DllImportAttribute jsou umístěny v odkazované nespravované knihovně DLL.Jestliže v knihovně není žádná metoda se zadaným názvem nebo jestliže argumenty pro metodu neodpovídají argumentům funkce, modul CLR vyvolá výjimku.

Jak vyřešit porušení

Porušení tohoto pravidla lze odstranit opravením metody s atributem DllImportAttribute.Je třeba se ujistit, že nespravovaná knihovna existuje a že je ve stejném adresáři jako sestavení, které metodu obsahuje.Jestliže je metoda správně umístěna a odkazována, je třeba ověřit, že název metody, návratový typ a podpis argumentu odpovídají funkci knihovny.

Kdy potlačit upozornění

Jestliže je nespravovaná knihovna ve stejném adresáři jako spravované sestavení ,které na ni odkazuje, nedoporučuje se toto upozornění potlačovat.Upozornění lze potlačit v případě, že nespravovaná knihovna nemůže být nalezena.

Příklad

Následující příklad ukazuje typ, který toto pravidlo porušuje.V knihovně kernel32.dll neexistuje funkce s názvem 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();
   }
}

Viz také

Referenční dokumentace

System.Runtime.InteropServices.DllImportAttribute