如何在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
这不是问题。它在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
,并由某个静态构造函数选择。