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

9

在浏览由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);  

使用 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,就像 public static extern 一样?我认为,extern 是告诉编译器该方法在外部定义的意思。

在你发布的例子中,你正在导入相同的方法。这样可以让你拥有两个不同的实现。这就是为什么如果你不理解它们生成的代码,那么代码生成器基本上是无用的原因。 - Security Hound
1个回答

14
EntryPoint字段用于告诉.NET运行时从被调用的DLL中调用哪个函数;如果没有设置,默认值是与.NET方法声明相同的名称。在您的第二个示例中,省略 EntryPoint ="ReadFile"会导致运行时尝试调用一个名为ReadFile2的函数(该函数不存在)。
原型需要具有staticextern修饰符,因为规范如此规定。它不需要是public的;控制方法的可见性完全取决于您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接