如何在C#中映射HALF_PTR

本文关键字:HALF PTR 映射 | 更新日期: 2023-09-27 18:27:43

我目前正在建模一种类型转换机制,该机制将本机(Windows数据类型)转换为.NET

示例:

HANDLE = System.IntPtr
HDC = System.IntPtr
WORD = System.UInt16

INT_PTR在各自的机器上是32位/64位,所以在.NET中是System.IntPtr

HALF_PTR(和其他)在其各自的32bit/64bit机器上是16bit/32bit。。。

那么我该如何在.NET中为HALF_PTR建模?如果可能的话?

我想另一种看待这个问题的方法是:是否有一个"短"指针等价于C#。。。像ShortPtr

如何在C#中映射HALF_PTR

这不是问题。它在Basetsd.h中声明,但在任何winapi声明中都没有实际使用。你遇到它的几率非常接近于零。

如果必须的话,它只为以64位处理器为目标的程序定义。它将一个64位指针映射到两个32位的两半。通过将IntPtr转换为UInt64,并使用& 0xffffffff>> 32获得两个UInt32部分,您将获得相同的结果。

我认为这在.NET中是不可能的(我指的是Microsoft.NET实现)。在Mono中,可以根据当前的体系结构有条件地将引用重定向到dll,因此可以创建两个HalfPtr struct,一个用于32位系统,另一个用于64位系统,但在.NET上这是不可能的。条件编译(#if)只在编译时进行,而不是在运行时进行,您可能需要类似的东西,但在运行时,并且自动封送处理的功能不足以执行"条件"。

单声道:

<configuration>
    <dllmap dll="myhalfptrdll">
        <dllentry dll="myhalfptrdll32.so" wordsize="32" />
        <dllentry dll="myhalfptrdll64.so" wordsize="64" />
    </dllmap>
</configuration>

对于极少数情况,唯一可能的解决方案是制作两个PInvoke extern,一个"指向"int,一个指向short,并由某个静态构造函数选择。