【问题标题】:DllImport user32 vs user32.dllDllImport 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。

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

【问题讨论】:

  • 相关文档为LoadLibrary如果字符串指定了一个不带路径的模块名称并且省略了文件扩展名,则该函数将默认库扩展名.dll 附加到模块名称。要防止函数将 .dll 附加到模块名称,请在模块名称字符串中包含一个尾随点字符 (.)。

标签: c# .net pinvoke dllimport user32


【解决方案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 运行时将在其中查找别名。

【讨论】:

    猜你喜欢
    • 2012-02-03
    • 2012-02-01
    • 2013-01-21
    • 1970-01-01
    • 2020-10-09
    • 2014-01-21
    • 1970-01-01
    • 2015-06-06
    • 1970-01-01
    相关资源
    最近更新 更多