3

正如标题所问,当您导入诸如 User32.dll 之类的 DLL 并声明调用该 DLL 上的方法的方法时,为什么需要将这些方法声明为静态和外部。

IE,这是取自另一个 StackOverflow 答案,但演示了我的要求。

[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, UIntPtr dwExtraInfo);
4

2 回答 2

3

static- 由于它们不需要类的实例,这些方法是对系统 API 的调用,不需要任何初始化,可以在静态/非静态块中使用

extern- extern 修饰符用于声明在外部实现的方法。由于 API 方法未在类文件本身中声明,因此 extern 告诉编译器该方法在 else-where 中声明。

于 2013-03-25T15:05:43.227 回答
1

虽然我真的不知道这是否有技术细节,但我想说的原因是:

驻留在外部 DLL 中的静态
方法不能绑定到任何对象实例。如果它们被绑定到一个对象实例,DLL 将不得不跟踪每次调用该方法的实例。

extern
我猜这只是一个关键字,告诉编译器插入用于绑定 DLL 的代码,而不是期望该方法在 C# 中实现。

于 2013-03-25T15:06:18.823 回答