将 Windows 数据类型映射到 .NET

Posted

技术标签:

【中文标题】将 Windows 数据类型映射到 .NET【英文标题】:Mapping Windows Data Types to .NET 【发布时间】:2013-04-19 10:49:54 【问题描述】:

我一直在查看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

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

问题:

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

【问题讨论】:

你需要这个做什么?对于本机互操作,P/Invoke 也可以自行编组类型(例如,您使用 string 并将其编组为 wchar_t*)。 @Јοеу,作为一个更大项目的一部分,创建一个实用程序,我可以在其中将 C++ 实现(函数/结构)输入到文本框中,并生成它的 C# 等效项。我知道这样的工具已经存在,但它们似乎都遗漏了一些东西……尤其是关于 IN,它应该映射到 [In],但许多转换器似乎都省略了这些跨度> TCHAR 是 Windows 95 的保留,您今天可以放心地忽略它。 【参考方案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。

【讨论】:

以上是关于将 Windows 数据类型映射到 .NET的主要内容,如果未能解决你的问题,请参考以下文章

将 NULL 映射到类型默认值

如何将单个 .NET 类型映射到 ElasticSearch/NEST 中的多个嵌套对象类型?

SpringData JPA--解决将Map等集合类型映射到数据库的问题

哪种 .NET 数据类型最适合在 NHibernate 中映射 NUMBER Oracle 数据类型?

LinQ to SQL 查询

是否可以将元素名称映射到 php 类(SoapClient)