将Windows数据类型映射到.NET

时间:2013-04-19 10:49:54

标签: c# c++ .net winapi types

我正在查看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在这方面做同样的事情,因为IntPtrUIntPtr是特定于平台的,因此可以在32位和64位机器之间进行调整。

现在,我们考虑LONGLONG

#if !defined(_M_IX86)
 typedef __int64 LONGLONG; 
#else
 typedef double LONGLONG;
#endif

所以在.NET中,我的假设是这映射到Int64long)?

另外,请考虑TCHAR

#ifdef UNICODE
 typedef WCHAR TCHAR;
#else
 typedef char TCHAR;
#endif

我的假设是这个映射到char(因为.NET的char是unicode)?

问题:

  1. 如果原生类型是平台相关的,那么它的.NET等价物是否应该是两个定义中较大的一个?
  2. 映射数据类型时是否存在任何已知缺陷?

1 个答案:

答案 0 :(得分:1)

查看Platform Invoke Data Types

映射数据类型时存在许多缺陷。例如,Windows数据类型BOOLBoolean之间的差异。 .NET Boolean数据类型(C#bool)的默认封送将封装为32位整数以匹配Windows BOOL类型。 Windows Boolean数据类型是一个字节。如果您想将C#bool传递给Windows Boolean,则必须指定自定义编组。

结构打包可能会让你失望,编组数组可能会非常棘手,尤其是结构中的数组。

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