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