我在c ++中有一个结构:
struct some_struct{
uchar* data;
size_t size;
}
我想在manged(c#)和native(c ++)之间传递它。 C#中的size_t
相当于什么?
P.S。我需要一个完全匹配的大小,因为任何字节差异将导致包装
时的巨大问题编辑:
本机和manged代码都在我的完全控制之下(我可以编辑我想要的任何内容)
答案 0 :(得分:11)
没有C#等同于size_t
。
C# sizeof()
operator始终返回int
值,无论平台如何,因此从技术上讲,size_t
的C#等效值为int
,但这对您没有帮助
(请注意,Marshal.SizeOf()
也会返回int
。)
另请注意,就sizeof()
和Marshal.Sizeof()
而言,没有C#对象的大小可以大于2GB。数组可能大于2GB,但您不能将sizeof()
或Marshal.SizeOf()
用于数组。
出于您的目的,您需要知道DLL中的代码版本用于size_t
的内容,并在C#中使用适当的大小整数类型。
要实现的一件重要事情是,在C / C ++中,size_t
通常与intptr_t
具有相同的位数,但这不能保证,特别是对于分段体系结构。
我知道有很多人说"使用UIntPtr
",这通常会有效,但不保证是正确的。
来自C/C++ definition of size_t
,size_t
是sizeof运算符的结果的无符号整数类型;
答案 1 :(得分:5)
C#中size_t的最佳等价物是UIntPtr类型。它在32位平台上是32位,在64位平台上是64位,而且是无符号的。