0

我一直在查看Windows 数据类型列表,因为我试图弄清楚每种类型如何映射到它的等效 .NET 类型。

我注意到一些类型定义被#if 标签包围,这会根据平台更改它们的定义。

例如,这里是定义INT_PTR

#if defined(_WIN64) 
 typedef __int64 INT_PTR; 
#else 
 typedef int INT_PTR;
#endif

我的理解是,这会在 64INT_PTR位机器上创建 64 位,INT_PTR在 32 位机器上创建 32 位。好的....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)?

问题:

  1. 如果本机类型依赖于平台,它的 .NET 等效项是否应该是两个定义中较大的一个?
  2. 映射数据类型时是否有任何已知的陷阱?
4

1 回答 1

1

查看平台调用数据类型

映射数据类型时有很多陷阱。例如,Windows 数据类型BOOLBoolean. Boolean.NET数据类型 (C# )的默认封送处理bool会将其封送为 32 位整数以匹配 WindowsBOOL类型。WindowsBoolean数据类型是一个字节。如果要将 C#bool传递给 Windows Boolean,则必须指定自定义封送处理。

结构打包可能会让您感到困惑,并且编组数组可能非常棘手,尤其是结构内部的数组。

您一定要非常仔细地阅读Marshaling Data with Platform Invoke 。

于 2013-04-19T14:11:40.277 回答