将 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 在这方面做了同样的事情,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)?
问题:
-
如果本机类型依赖于平台,它的 .NET 等效项是否应该是两个定义中较大的一个?
映射数据类型时是否有任何已知的陷阱?
【问题讨论】:
你需要这个做什么?对于本机互操作,P/Invoke 也可以自行编组类型(例如,您使用string
并将其编组为 wchar_t*
)。
@Јοеу,作为一个更大项目的一部分,创建一个实用程序,我可以在其中将 C++ 实现(函数/结构)输入到文本框中,并生成它的 C# 等效项。我知道这样的工具已经存在,但它们似乎都遗漏了一些东西……尤其是关于 IN,它应该映射到 [In],但许多转换器似乎都省略了这些跨度>
TCHAR
是 Windows 95 的保留,您今天可以放心地忽略它。
【参考方案1】:
查看Platform Invoke Data Types。
映射数据类型时有很多陷阱。例如,Windows 数据类型BOOL
和Boolean
之间的区别。 .NET Boolean
数据类型 (C# bool
) 的默认封送处理将其封送为 32 位整数以匹配 Windows BOOL
类型。 Windows Boolean
数据类型是一个字节。如果您想将 C# bool
传递给 Windows Boolean
,则必须指定自定义封送处理。
结构打包可能会让您大吃一惊,封送数组可能非常棘手,尤其是结构内部的数组。
你一定要非常仔细地阅读Marshaling Data with Platform Invoke。
【讨论】:
以上是关于将 Windows 数据类型映射到 .NET的主要内容,如果未能解决你的问题,请参考以下文章
如何将单个 .NET 类型映射到 ElasticSearch/NEST 中的多个嵌套对象类型?
SpringData JPA--解决将Map等集合类型映射到数据库的问题