我目前正在将一个专有的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#的int
(int
)或无符号版本对Int32
进行编组。 API的tLONG
和tINT
同样如此(至少对于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的意图是什么。除了我上面提到的标题注释之外,没有关于实际类型的信息。
答案 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*
。