2

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

例子:

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

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

HALF_PTR(和其他人)在各自的 32 位/64 位机器上是 16 位/32 位...

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

我想另一种看待这个问题的方式是:C# 是否有等效的“短”指针......类似于 ShortPtr?

4

2 回答 2

3

这是一个非问题。它在 Basetsd.h 中声明,但实际上并未在任何winapi 声明中使用。您实际上遇到它的几率非常接近于零。

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

于 2013-08-15T13:35:40.857 回答
2

我认为这在 .NET 中是不可能的(我的意思是 Microsoft .NET 实现)。在 Mono 中,可以有条件地将引用重定向到基于当前架构的 dll,因此您可以创建两个HalfPtr structs,一个用于 32 位系统,一个用于 64 位系统,但在 .NET 上这是不可能的。条件编译 ( #if) 仅在编译时,而不是在运行时,您需要类似但在运行时的东西,并且自动编组功能不足以执行“条件”。

在单声道上:

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

对于极少数情况,唯一可能的解决方案是制作 2 个 PInvoke extern,它们将一个“指向” anint和一个指向 ashort并且由某个静态构造函数选择。

于 2013-08-15T13:14:13.467 回答