64位Windows上的P/Invoke是否需要与32位不同的签名?当我创建引用user32.dll的签名时,如果目标是64位计算机,我应该使用user64.dll构建它吗?[DllImport("user32.dll",CharSet=CharSet.Auto)]publicstaticexternboolChangeClipboardChain(IntPtrhWndRemove,IntPtrhWndNewNext);目前这不是问题,因为我只针对32位,因为供应商(ProgressOpenEdge)该库只提供32位库来访问他们的数据库。我目前没有64位Windows计算机,无法查看是否属于这种情况。尽管有命名约定,user32.dll(和其他32...dll)在64位机器上实际上是64位的。这些是dll的历史名称,无论底层架构如何变化,它们都会保持原样。阅读此页面了解更多详情。在调用USER32.DLL函数时,您不需要更改链接到的DLL的签名/名称。尽管有命名约定,但在64位Windows计算机上,位于[Windows]System32中的USER32.DLL文件实际上是一个64位DLL。USER32.DLL的真正32位版本实际上位于名为[Windows]SysWow64的文件夹中。有关详细信息,请参阅此问题。您可能需要特别注意的一件事是您作为参数传递给各种WindowsAPI函数的数据类型。例如,USER32.DLL中的“SendMessage”函数有至少一个参数的特定要求(根据P/Invoke上的页面)。它的签名是:[DllImport("user32.dll",CharSet=CharSet.Auto)]staticexternIntPtrSendMessage(IntPtrhWnd,UInt32Msg,IntPtrwParam,IntPtrlParam);和下面的注释2和3明确指出:2)永远不要使用“int”或“integer”作为lParam。您的代码将在64位Windows上崩溃。仅使用IntPtr、“ref”结构或“out”结构。3)永远不要使用“bool”、“int”或“integer”作为返回值。您的核心将在64位Windows上崩溃。只需使用IntPtr。使用bool不安全-pInvoke无法将IntPtr编组为bool。这个“警告”似乎是特定于这个特定函数(SendMessage)的,尽管这是我在调用任何WindowsAPI函数时要特别注意的事情。以上是C#学习教程:DoesP/Invokeon64-bitwindowsrequireadifferentsignaturethan32-bit?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
