Ao passar por wrappers gerados pelo SWig, eu acho que os PInvokes estão sem nenhum ponto de input, mas alguns lugares eu acho que eles são defrined com o Entrypoint. Então, qual a diferença entre eles, Ex:
// Definido sem ponto de input
[DllImport("Kernel32.dll", CharSet = CharSet.Unicode)] public static extern bool ReadFile( HandleRef hndRef, StringBuilder buffer, int numberOfBytesToRead, out int numberOfBytesRead, int flag);
// Definido com Entrypoint
[DllImport("Kernel32.dll", CharSet = CharSet.Unicode, EntryPoint = "ReadFile")] public static extern bool ReadFile2( HandleRef hndRef, StringBuilder buffer, int numberOfBytesToRead, out int numberOfBytesRead, Overlapped2 flag);
}
Também por que a function tem que ser estática como em extern static público? E conforme o extern é considerado, eu suponho que ele esteja dizendo ao compilador que esse método é definido externamente?
O campo EntryPoint
serve para informar ao runtime do .NET qual function chamar da DLL sendo invocada; se não estiver definido, o padrão é o mesmo nome da declaração do método .NET. Em seu segundo exemplo, omitindo EntryPoint = "ReadFile"
resultaria no tempo de execução tentando chamar uma function chamada ReadFile2
(que não existe).
O protótipo precisa ter os modificadores static
e extern
porque a especificação diz isso. Não precisa ser public
; Controlar a visibilidade do método depende inteiramente de você.