7

这里 DllImport 的用法有什么区别?具体来说,“user32”只是表示“user32.dll”,还是表示“user32.lib”或其他什么?

[DllImport("user32")]
protected static extern int GetKeyboardState(byte[] pbKeyState);

[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
protected static extern short GetKeyState(int vKey);

您可能可以忽略 CharSet 和 CallingConvention。

如果它们相同,我可以重写它以使其更加一致,但如果不是,我不想有一堆问题。

4

2 回答 2

13

在这个例子中,没有区别。.dll 扩展名将自动附加"user32"到创建"user32.dll". 然而,这并非总是如此。如果库文件名包含句点,则不会自动附加 .dll 扩展名。

一些例子:

[DllImport("user32")]--> 解析“User32.dll”。正确的。

[DllImport("user32.dll")]--> 解析“User32.dll”。正确的。

[DllImport("mylib.version5")]--> 解决“mylib.version5”。不正确

[DllImport("mylib.version5.dll")]--> 解决“mylib.version5.dll”。正确的。

于 2012-03-06T03:20:34.667 回答
1

在 Windows 上没有区别,如果省略扩展名,导入将成功执行。通常在使用配置部分运行 Mono 时需要省略扩展<dllmap>,其中 P/Invoke 运行时将查找别名。

于 2012-03-05T22:38:45.650 回答