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

C# 为什么需要使用EntryPoint属性定义DLLImport,c#,c++,pinvoke,C#,C++,Pinvoke,在浏览生成的包装时,我发现PInvokes没有定义任何入口点,但有些地方确实有入口点。那么它们之间的区别是什么呢?何时需要定义入口点,何时不需要 定义时没有入口点: [DllImport("Kernel32.dll", CharSet = CharSet.Unicode)] public static extern bool ReadFile( HandleRef hndRef, StringBuilder buffer, int numberOf

在浏览生成的包装时,我发现PInvokes没有定义任何入口点,但有些地方确实有入口点。那么它们之间的区别是什么呢?何时需要定义入口点,何时不需要

定义时没有
入口点

[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);
使用
入口点定义

[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
告诉编译器此方法是在外部定义的?

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


原型需要有
静态
和修饰符,因为。它不需要是公共的;控制方法的可见性完全取决于您。

在您发布的示例中,您正在导入相同的方法。这允许您有两种不同的实现。这就是为什么如果您不理解代码生成器生成的代码,那么代码生成器基本上是无用的。