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
精彩评论