Udostępnij za pośrednictwem


CA1400: Powinny istnieć punkty wejścia P/Invoke

TypeName

PInvokeEntryPointsShouldExist

CheckId

CA1400

Kategoria

Microsoft.Interoperability

Zmiana kluczowa

Niekluczowa

Przyczyna

Metoda publiczna lub chroniona jest oznaczona DllImportAttribute.Nie można zlokalizować biblioteki niezarządzanej lub metoda nie możne zostać dopasowana do funkcji w bibliotece.Jeśli reguła nie może znaleźć nazwy metody dokładnie takiej, jaka jest określona, szuka wersji ANSI lub szerokich znaków, metody przez dodanie przyrostka 'A' lub 'W' do nazwy metody.Jeśli nic nie znaleziono, reguła próbuje zlokalizować funkcję przy użyciu formatu nazwy __stdcall (_MyMethod@12, gdzie 12 reprezentuje długość argumentów).Jeśli nic nie znaleziono, a nazwa metody zaczyna się od '#', reguła szuka funkcji jako odwołania porządkowego, a nie odwołania nazwy.

Opis reguły

Nie istnieje sprawdzenie w czasie kompilacji, za pomocą którego można upewnić się, że metody oznaczone DllImportAttribute znajdują się w odwoływanej niezarządzanej bibliotece DLL.Jeśli żadna funkcja, która posiada określoną nazwę nie znajduje się w bibliotece, lub argumenty metody nie pasują do argumentów funkcji, środowisko uruchomieniowe języka wspólnego wyrzuca wyjątek.

Jak naprawić naruszenia

Aby naprawić naruszenie tej zasady, popraw metodę, która ma atrybut DllImportAttribute.Upewnij się, że niezarządzana biblioteka istnieje i jest w tym samym katalogu co zestaw, który zawiera metody.Jeśli biblioteka jest obecna i poprawnie wskazywana, sprawdź, czy nazwa metody, zwracany typ i sygnatura argumentów pasują do funkcji w bibliotece.

Kiedy pominąć ostrzeżenia

Nie pomijaj ostrzeżenia od tej reguły, gdy niezarządzana biblioteka jest w tym samym katalogu co zestaw zarządzany, który odwołuje się do niej.Może być bezpieczne pominięcie tego ostrzeżenia, w przypadku, gdy biblioteka niezarządzana nie może zostać zlokalizowana.

Przykład

Poniższy przykład pokazuje typ, który narusza regułę.Nie ma funkcji o nazwie DoSomethingUnmanaged w bibliotece kernel32.dll.

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ż

Informacje

DllImportAttribute