gpt4 book ai didi

c# - 为什么我需要用 EntryPoint 属性定义 DLLImport

转载 作者:太空狗 更新时间:2023-10-29 19:53:45 28 4
gpt4 key购买 nike

在遍历 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);

入口点定义:

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

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

最佳答案

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

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

关于c# - 为什么我需要用 EntryPoint 属性定义 DLLImport,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11135607/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com