DllImport user32 vs user32.dll

Posted

技术标签:

【中文标题】DllImport user32 vs user32.dll【英文标题】: 【发布时间】:2012-03-23 09:59:35 【问题描述】:

这里 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。

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

【问题讨论】:

Here is the MSDN page on the constructor 供参考。 相关文档为LoadLibrary。 如果字符串指定了一个不带路径的模块名称并且省略了文件扩展名,则该函数将默认库扩展名.dll 附加到模块名称。要防止函数将 .dll 附加到模块名称,请在模块名称字符串中包含一个尾随点字符 (.)。 【参考方案1】:

在这个例子中,没有区别。 .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”。正确。

【讨论】:

似乎在 .NET 的 Mono 实现中,库名称中的句点不会阻止自动附加扩展名。 (至少在 Unity 4.5.1 中使用的 Mono 版本中,我认为它是 Mono 3.0 的变体。) +1 表示“库文件名中的句点”,我一直在为那个问题挠头好几个小时(现在很明显)。【参考方案2】:

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

【讨论】:

以上是关于DllImport user32 vs user32.dll的主要内容,如果未能解决你的问题,请参考以下文章

[DllImport("user32.dll")]这句代码是啥意思啊?没学过,解释下…

c# 用 FindWindowEx 获取子窗体时 出异常

DllImport使用

C#DllImport是干嘛的

VS 2010 post build,show application console

DllImport - ANSI 与 Unicode