2012-06-21 46 views
3

虽然通过SWig生成的包装器,但我发现PInvokes没有任何入口点,但是有些地方我发现它们使用Entrypoint进行了定义。那么,它们之间的区别,例如:为什么我需要使用EntryPoint属性来定义DLLImport

//定义不切入点

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

//与入口点定义

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

}

也是为什么函数必须是静态的,如在公共静态外部?根据extern的考虑,我认为它告诉编译器这个方法是由externaly定义的?

+0

在您发布的示例中,您正在导入相同的方法。这允许你有两个不同的实现。这是代码生成器基本上无用的原因,如果你不了解它们生成的代码。 –

回答

10

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

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

相关问题