为什么我需要使用EntryPoint属性定义DLLImport

Sim*_*ons 3 c# c++ pinvoke

在浏览SWig生成的包装器时,我发现PInvokes没有定义任何入口点,但有些地方确实有入口点.那么他们之间有什么区别?我什么时候需要定义一个EntryPoint,什么时候不需要?

定义没有EntryPoint:

[DllImport("Kernel32.dll", CharSet = CharSet.Unicode)]
public static extern bool ReadFile(
        HandleRef hndRef,
        StringBuilder buffer,
        int numberOfBytesToRead,
        out int numberOfBytesRead,
        int flag);  
Run Code Online (Sandbox Code Playgroud)

定义为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);
Run Code Online (Sandbox Code Playgroud)

为什么功能必须static如此public static extern?我假设这extern告诉编译器这个方法是在外部定义的吗?

Jon*_*Jon 10

EntryPoint字段用于告诉.NET运行时从被调用的DLL调用哪个函数; 如果未设置,则默认值与.NET方法声明的名称相同.在第二个示例中,省略EntryPoint = "ReadFile"将导致运行时尝试调用名为ReadFile2(不存在)的函数.

原型需要有staticextern修饰符,因为规范说明了这一点.它不需要public; 控制方法的可见性完全取决于你.