Por que preciso definir o atributo DLLImport with EntryPoint?

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ê.