size_t compatible type for FFI

Viewed 290

I'm writing C# bindings for a C library using unsafe code. I can't figure out how to represent a size_t that works in all cases:

  • System.[U]IntPtr can't be used with fixed-sized buffer (which I need), because they are whitelisted to only work with a few primitive types.
  • Aliasing the type with using Usize = System.Uint32/64 with compile time directives works, but a) breaks the portability of the resulting binary between architectures and b) I'd have to add the using block to everywhere that used the Usize type.

So, what is the correct way to write C bindings using size_t?

1 Answers

The size_t varies depending on the platform and no C# equivalent. And .Net states that

Unfortunately there is no predefined solution for these types in .NET 2.0. So one has to be devised. The biggest issue is that you typically run the same .NET binary or 32 and 64 bit. So we need a type whose size is determined at runtime based on hints from the platform. Defining a type like this just isn’t possible with .NET. The best recourse is to define a fixed size type and a custom marshaler that will make the runtime size decision.

So using UIntPtr will be your only option by aliasing the type with using Usize = System.Uint32/64

Related