我正在阅读有关编组的内容。我很困惑,因为在非托管代码中这意味着什么。HRESULT、DWORD 和 HANDLE。原文是:
您已经知道托管和非托管环境之间没有这种兼容性。换句话说,.NET 不包含非托管代码领域中存在的 HRESULT、DWORD 和 HANDLE 类型。因此,如果需要,您需要找到一个 .NET 替代品或创建您自己的替代品。这就是所谓的编组。
我正在阅读有关编组的内容。我很困惑,因为在非托管代码中这意味着什么。HRESULT、DWORD 和 HANDLE。原文是:
您已经知道托管和非托管环境之间没有这种兼容性。换句话说,.NET 不包含非托管代码领域中存在的 HRESULT、DWORD 和 HANDLE 类型。因此,如果需要,您需要找到一个 .NET 替代品或创建您自己的替代品。这就是所谓的编组。
它只是告诉您必须将一种编程语言中使用的一种数据类型“映射”到另一种编程语言中使用的另一种数据类型,并且数据类型必须匹配。
对于这个,细节可能不正确,但概念是正确的。
这些是在 C/C++ 的 Windows 头文件中定义的一些数据类型。它们是“宏”,将 C/C++ 的原始数据类型“抽象”为 Windows 编程中使用的更有意义的数据类型。例如,DWORD
在 C/C++ 中实际上是一个 32 位无符号整数,但在 64 位处理器上,它在头文件中被定义为一个 64 位无符号整数。这个想法是在处理器所需的数据类型和语言使用的数据类型之间提供一个抽象层。
在编组期间,此“dword”将转换为您在声明中指定的 CLR数据DllImport
类型。这是很重要的一点。
假设您要调用一个带有DWORD
参数的 Windows API 方法。在 C# 中使用 声明此调用时DllImport
,必须将参数数据类型指定为System.UInt32
。如果你不这样做,“坏事就会发生”。
例如,如果您错误地将参数数据类型指定为System.UInt64
. 当进行实际调用时,堆栈将损坏,因为堆栈上的字节数比 API 调用预期的要多。这可能导致完全出乎意料的行为,例如应用程序崩溃、Windows 崩溃、返回值无效等等。
这就是为什么指定正确的数据类型很重要的原因。
System.UInt32
。IntPtr
, UintPtr
, 或HandleRef
System.Int32
或System.UInt32
使用 P/Invoke 从您的托管类调用非托管 API在http://msdn.microsoft.com/en-us/library/aa719104(v=vs.71).aspx有一个表格列出了 Windows 数据类型及其对应的专门回答您的问题的 CLR 数据类型。
Windows 数据类型 (Windows),位于http://msdn.microsoft.com/en-us/library/aa383751(v=VS.85).aspx
.NET 专栏:使用 P/Invoke在C# 中调用 Win32 DLL,位于http://msdn.microsoft.com/en-us/magazine/cc164123.aspx
HRESULT:http ://en.wikipedia.org/wiki/HRESULT
在计算机编程领域,HRESULT 是 Windows 操作系统以及更早的 IBM/Microsoft OS/2 操作系统中使用的一种数据类型,用于表示错误条件和警告条件。HRESULT 的最初目的是正式列出供公众和 Microsoft 内部使用的错误代码范围,以防止 OS/2 操作系统的不同子系统中的错误代码发生冲突。HRESULT 是数字错误代码。HRESULT 中的各个位对有关错误代码性质及其来源的信息进行编码。HRESULT 错误代码在 COM 编程中最常见,它们构成了标准化 COM 错误处理约定的基础。
双字:http ://en.wikipedia.org/wiki/DWORD#Size_families
句柄:http ://en.wikipedia.org/wiki/Handle_(计算)
在计算机编程中,句柄是对资源的抽象引用。当应用程序软件引用由另一个系统(例如数据库或操作系统)管理的内存块或对象时,将使用句柄。虽然指针字面上包含它所引用的项目的地址,但句柄是外部管理的引用的抽象;它的不透明度允许系统将所指对象重新定位到内存中,而不会使句柄无效,这对于指针是不可能的。额外的间接层还增加了管理系统对在所指对象上执行的操作的控制。通常,句柄是指向全局墓碑数组的索引或指针。
HRESULT
, DWORD
, 和HANDLE
are typedef
's(即,它们代表纯数据类型)由 Microsoft 定义,供在 Windows 环境中编译 *un*managed 代码的程序员使用。它们在 Microsoft 提供的 C(或 C++)头文件中定义,通常自动包含在 Microsoft Visual Studio 中创建的非托管 Windows 项目中。