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")]这句代码是啥意思啊?没学过,解释下…