7

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

没有定义EntryPoint

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

定义为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);

另外为什么函数必须static像 in 一样public static extern?我假设这extern告诉编译器这个方法是在外部定义的?

4

1 回答 1

13

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

原型需要有staticandextern修饰符,因为规范是这么说的。它不需要是public;控制方法的可见性完全取决于您。

于 2012-06-21T09:52:26.473 回答