C ++ int&在C#中长时间编组

时间:2010-12-27 20:02:16

标签: c# c++ marshalling

我目前正在将一个专有的dll(API)移植到C#,在编组一些使用过的数据类型时我遇到了一些问题。

例如,API头文件定义了以下类型:

typedef unsigned int  tINT;  /* natural unsigned */
typedef signed int    tINTs; /* natural signed */
typedef unsigned int  tLONG; /* 32 bit unsigned */
typedef unsigned long tPTR;  /* 32/64-bit pointer */

然后我举例说明了以下函数:

tINTs SomeApiFunction ( const tPTR hdl, tINT param );

我通常直接使用C#的intint)或无符号版本对Int32进行编组。 API的tLONGtINT同样如此(至少对于API而言)。但我不确定tPTR。我现在在C#中使用uint,因为它是32位int,但我不确定long在64位机器上的行为。

我需要做些什么才能确保API能够在32位和64位计算机上正常运行?

这就是我现在要做的事情:

[DllImport( "api.dll" )]
public static extern int SomeApiFunction ( uint hdl, uint param );

可悲的是,API并没有很好地记录,因此我不确定所有这些(重叠)typedef的意图是什么。除了我上面提到的标题注释之外,没有关于实际类型的信息。

4 个答案:

答案 0 :(得分:3)

尝试将其标记为IntPtr。 IntPtr在32位系统上是4个字节,在.Net中是64位系统上的8个字节。

答案 1 :(得分:3)

这是C / C ++编译器的实现细节。您应该通过评论并将其声明为IntPtr。如果代码是由MSVC编译器编译的,那么它不会在64位模式下工作,它会长时间使用32位。不足以存储指针。

答案 2 :(得分:2)

这是good list of type correspondence.

对于指针类型,通常是C#中的IntPtr

答案 3 :(得分:1)

如果我没记错int uint,其他基本类型是基础Windows API的正确类型。

但是,对于指针,最好在C#端使用IntPtr,在C / C ++端使用void*