在通过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
告诉编译器这个方法是在外部定义的吗?
答案 0 :(得分:10)
EntryPoint
字段用于告诉.NET运行时从被调用的DLL调用哪个函数;如果未设置,则默认值与.NET方法声明的名称相同。在第二个示例中,省略EntryPoint = "ReadFile"
将导致运行时尝试调用名为ReadFile2
的函数(不存在)。
原型需要有static
和extern
修饰符,因为specification这样说。它不需要是public
;控制方法的可见性完全取决于你。