CA1400: Vstupní body volání nespravovaného kódu by měly existovat

Zboží Hodnota
RuleId CA1400
Kategorie Microsoft.Interoperability
Změna způsobující chybu Nenarušující

Příčina

Veřejná nebo chráněná metoda je označena značkou System.Runtime.InteropServices.DllImportAttribute. Nespravovanou knihovnu nelze nalézt nebo nelze metodu porovnat s funkcí v knihovně. Pokud pravidlo nemůže najít název metody přesně tak, jak je zadán, vyhledá ANSI nebo široké znaky metody příponou názvu metody s příponou A nebo W. Pokud se nenajde žádná shoda, pravidlo se pokusí najít funkci pomocí formátu názvu __stdcall (_MyMethod@12, kde 12 představuje délku argumentů). Pokud se nenajde žádná shoda a název metody začíná řetězcem #, pravidlo vyhledá funkci jako pořadový odkaz místo odkazu na název.

Poznámka:

Toto pravidlo je zastaralé. Další informace najdete v tématu Zastaralá pravidla.

Popis pravidla

Není k dispozici žádná kontrola doby kompilace, aby se zajistilo, že metody označené DllImportAttribute pomocí jsou umístěny v odkazované nespravované knihovně DLL. Pokud není v knihovně žádná funkce, která má zadaný název, nebo argumenty metody neodpovídají argumentům funkce, modul CLR vyvolá výjimku.

Jak opravit porušení

Chcete-li opravit porušení tohoto pravidla, opravte metodu DllImportAttribute , která má atribut. Ujistěte se, že nespravovaná knihovna existuje a je ve stejném adresáři jako sestavení, které obsahuje metodu. Pokud je knihovna přítomna a správně odkazována, ověřte, zda název metody, návratový typ a podpis argumentu odpovídají funkci knihovny.

Kdy potlačit upozornění

Nepotlačujte upozornění z tohoto pravidla, pokud je nespravovaná knihovna ve stejném adresáři jako spravované sestavení, které na něj odkazuje. V případě, že nespravovaná knihovna nemohla být umístěna, může být bezpečné potlačit upozornění z tohoto pravidla.

Příklad

Následující příklad ukazuje typ, který porušuje pravidlo. V souboru kernel32.dll není uvedena žádná funkce, která je pojmenována 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é

System.Runtime.InteropServices.DllImportAttribute