开发者

IntPtr on a 32-bit OS and UInt64 on a 64-bit OS

I'm trying to do an interop to a C++ structure from C#. The structure (in a C# wrapper) is s开发者_如何学编程omething like this

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct SENSE4_CONTEXT
{
    public System.IntPtr dwIndex; // Or UInt64, depending on platform.
}

The underlying C++ structure is a bit abnormal. On a 32-bit OS, dwIndex must be IntPtr in order for the interop to work, but on a 64-bit OS, it must be UInt64 in order for the interop to work.

How can I modify the above structure to make it work on both a 32-bit and 64-bit OS?


If the "dw" prefix in dwIndex is accurate then it sounds like a DWORD, which is a 32-bit unsigned integer. In that case you need to use UIntPtr, which will be like UInt32 on 32-bit and like UInt64 on 64-bit.

It seems unlikely that your C++ program requires a signed integer on a 32-bit platform and an unsigned one on a 64-bit one (though not impossible, of course).


In a 64-bit process, an IntPtr should be marshalled exactly the same as a UInt64.
Make sure to set your Target Platform to Any CPU.

To treat it as a UInt64 in C#, you can write

UInt64 value = (UInt64)s.dwIndex.ToInt64();

If you need to run as a 32-bit process, you'll need to declare two different versions of the struct, and two different overloads of the methods that take it, and select one of them using an if statement.


You could use a compiler directive/platform detect, then do a common typedef:

typedef indexType IntPtr

or

typedef indexType UInt64

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜