C# 为什么需要使用EntryPoint属性定义DLLImport
在浏览生成的包装时,我发现PInvokes没有定义任何入口点,但有些地方确实有入口点。那么它们之间的区别是什么呢?何时需要定义入口点,何时不需要 定义时没有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
入口点
:
[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
的函数(该函数不存在)
原型需要有
静态
和修饰符,因为。它不需要是公共的;控制方法的可见性完全取决于您。在您发布的示例中,您正在导入相同的方法。这允许您有两种不同的实现。这就是为什么如果您不理解代码生成器生成的代码,那么代码生成器基本上是无用的。