我正在查看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
我的假设是这个映射到char(因为.NET的char是unicode)?
问题:
答案 0 :(得分:1)
映射数据类型时存在许多缺陷。例如,Windows数据类型BOOL
和Boolean
之间的差异。 .NET Boolean
数据类型(C#bool
)的默认封送将封装为32位整数以匹配Windows BOOL
类型。 Windows Boolean
数据类型是一个字节。如果您想将C#bool
传递给Windows Boolean
,则必须指定自定义编组。
结构打包可能会让你失望,编组数组可能会非常棘手,尤其是结构中的数组。
您一定要非常仔细地阅读Marshaling Data with Platform Invoke。