CA1400: Powinny istnieć punkty wejścia P/Invoke
Pozycja | Wartość |
---|---|
Ruleid | CA1400 |
Kategoria | Microsoft.Interoperability |
Zmiana powodująca niezgodność | Niezgodność |
Przyczyna
Publiczna lub chroniona metoda jest oznaczona znakiem System.Runtime.InteropServices.DllImportAttribute. Nie można zlokalizować biblioteki niezarządzanej lub dopasować metody do funkcji w bibliotece. Jeśli reguła nie może odnaleźć nazwy metody dokładnie tak, jak została określona, szuka wersji ANSI lub szerokiego znaku metody, sufiksując nazwę metody o nazwie "A" lub "W". Jeśli nie zostanie znalezione dopasowanie, reguła próbuje zlokalizować funkcję przy użyciu formatu nazwy __stdcall (_MyMethod@12, gdzie 12 reprezentuje długość argumentów). Jeśli nie zostanie znalezione dopasowanie, a nazwa metody zaczyna się od "#", reguła wyszukuje funkcję jako odwołanie porządkowe zamiast odwołania do nazwy.
Uwaga
Ta reguła została przestarzała. Aby uzyskać więcej informacji, zobacz Przestarzałe reguły.
Opis reguły
Nie jest dostępne sprawdzanie czasu kompilacji, aby upewnić się, że metody oznaczone za pomocą DllImportAttribute znajdują się w odwołanej niezarządzanej biblioteki DLL. Jeśli żadna funkcja o określonej nazwie nie znajduje się w bibliotece lub argumenty metody nie są zgodne z argumentami funkcji, środowisko uruchomieniowe języka wspólnego zgłasza wyjątek.
Jak naprawić naruszenia
Aby naprawić naruszenie tej reguły, popraw metodę DllImportAttribute , która ma atrybut . Upewnij się, że biblioteka niezarządzana istnieje i znajduje się w tym samym katalogu co zestaw zawierający metodę. Jeśli biblioteka jest obecna i poprawnie przywoływana, sprawdź, czy nazwa metody, typ zwracany i podpis argumentu są zgodne z funkcją biblioteki.
Kiedy pomijać ostrzeżenia
Nie pomijaj ostrzeżenia z tej reguły, gdy niezarządzana biblioteka znajduje się w tym samym katalogu co zarządzany zestaw odwołujący się do niego. W przypadku, gdy nie można znaleźć niezarządzanej biblioteki, można bezpiecznie pominąć ostrzeżenie z tej reguły.
Przykład
W poniższym przykładzie pokazano typ, który narusza regułę. W pliku kernel32.dll nie występuje żadna nazwana DoSomethingUnmanaged
funkcja.
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();
}
}
Zobacz też
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla