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é
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro