c# - 将 Windows 数据类型映射到 .NET

标签 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 中,我的假设是它映射到 Int64 (long)?

另外,考虑 TCHAR

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

我这里的假设是 this 映射到 char(因为 .NET 的 char 无论如何都是 unicode)?

问题:

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

最佳答案

查看 Platform Invoke Data Types .

映射数据类型时有很多陷阱。例如,Windows 数据类型 BOOLBoolean 之间的区别。 .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/

相关文章:

c# - 如何以编程方式将循环转换为单个表达式?

c# - LINQ中左外连接和右外连接的实现区别

c++ - 如何在主函数中访问订阅者类的公共(public)变量?

c# - 如何将数据附加到二进制文件?

.net - Win 2003 上的 DB2 Client v9.5 需要很长时间才能建立连接

c# - 我正在尝试从尚未使用 LINQ 创建具有特定属性的附加对象的用户列表中创建新的用户列表

c# - System.Management 资源监控统计信息,如 I/O、CPU、内存使用...等'

C++脉冲计数器

python - 如何在 Linux 上快速将大数据从 C++ 发送到 Python?

.net - 用于映射 IDictionary<SomeEntity, int> 的流畅代码?