Sdílet prostřednictvím


CA1400: Vstupní body volání nespravovaného kódu by měly 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 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

DllImportAttribute