Udostępnij za pośrednictwem


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ż

System.Runtime.InteropServices.DllImportAttribute