Collectives™ on Stack Overflow
Find centralized, trusted content and collaborate around the technologies you use most.
Learn more about Collectives
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
Learn more about Teams
I'm trying to do an interop to a C++ structure from C#. The structure (in a C# wrapper) is something 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
typedef indexType UInt64
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.