我刚刚查看了 Windows Data Types 的列表因为我正在尝试弄清楚每种类型如何映射到它的等效 .NET 类型。
我注意到一些类型定义被 #if 标签包围,这会根据平台更改它们的定义。
例如,这里是INT_PTR
的定义
#if defined(_WIN64)
typedef __int64 INT_PTR;
#else
typedef int INT_PTR;
#endif
我的理解是,这会在 64 位机器上创建一个 64 位 INT_PTR
,在 32 位机器上创建一个 32 位 INT_PTR
。好的......NET 在这方面做了同样的事情,因为 IntPtr
和 UIntPtr
是特定于平台的,因此适应 32 位和 64 位机器。
现在,让我们考虑LONGLONG
#if !defined(_M_IX86)
typedef __int64 LONGLONG;
#else
typedef double LONGLONG;
#endif
所以在 .NET 中,我的假设是它映射到 Int64
(long
)?
另外,考虑 TCHAR
#ifdef UNICODE
typedef WCHAR TCHAR;
#else
typedef char TCHAR;
#endif
我这里的假设是 this 映射到 char(因为 .NET 的 char 无论如何都是 unicode)?
问题:
- 如果 native 类型依赖于平台,那么它的 .NET 等价物是否应该是两个定义中较大的一个?
- 映射数据类型时是否存在任何已知的陷阱?
最佳答案
查看 Platform Invoke Data Types .
映射数据类型时有很多陷阱。例如,Windows 数据类型 BOOL
和 Boolean
之间的区别。 .NET Boolean
数据类型 (C# bool
) 的默认编码(marshal)处理会将其编码(marshal)为 32 位整数以匹配 Windows BOOL
类型. Windows Boolean
数据类型是一个字节。如果要将 C# bool
传递给 Windows Boolean
,则必须指定自定义编码(marshal)处理。
结构打包可能会让您感到困惑,编码数组可能非常棘手,尤其是结构内部的数组。
你肯定想读Marshaling Data with Platform Invoke非常仔细。
关于c# - 将 Windows 数据类型映射到 .NET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16102905/