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

时间:2012-06-21 09:48:15

标签: 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);  

使用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告诉编译器这个方法是在外部定义的吗?

1 个答案:

答案 0 :(得分:10)

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

原型需要有staticextern修饰符,因为specification这样说。它不需要是public;控制方法的可见性完全取决于你。