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