When working with unmanaged libraries an integers size might be dependant on the processor architecture it is compiled for. For example, iOS's NSInteger can be either 32-bit or 64-bit.
C# 9.0 introduces the nint
and nuint
types that behave much as int
and uint
on 32-bit systems and as long
and ulong
on 64-bit systems.
Code
C#
[DllImport("math.dll", EntryPoint = "Add", CallingConvention = CallingConvention.Cdecl)]
static extern nint Add(nint a, nint b);
var result = Add(1, 2);
C#
#if X64
[DllImport("math.dll", EntryPoint = "Add", CallingConvention = CallingConvention.Cdecl)]
static extern long Add(long a, long b);
#else
[DllImport("math.dll", EntryPoint = "Add", CallingConvention = CallingConvention.Cdecl)]
static extern int Add(int a, int b);
#endif
var result = Add(1, 2);
Notes
While C# already has IntPtr to provide similar architecture-specific behavior it is intended for memory addressing and has intentionally limited conversion and mathematical operators.