【发布时间】:2013-11-15 00:50:48
【问题描述】:
我在项目中使用[DLLImport] 引用了一个非托管 DLL,但是当我匹配方法签名时收到奇怪的结果。
这是来自 DLL 的示例签名:
DLLEXPORT unsigned long OpenPort(unsigned long ulPort,
unsigned long ulBaudRate,
unsigned long ulByteSize,
unsigned long ulPartity,
unsigned long ulStopBits,
unsigned long ulFlowControl)
这是我导入函数的 C# 代码:
[DllImport("C:/my.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern uint OpenPort(ulong ulPort, ulong ulBaudRate,
ulong ulByteSize, ulong ulParity, ulong ulStopBits, ulong ulFlowControl);
请注意,我使用 uint 的返回类型声明了这一点,因为当我尝试使用 ulong 时,我得到了意想不到的结果(长数字通常看起来有点像内存地址)。
但是,如果我使用int/uint 的返回类型,该函数将起作用并返回预期结果。谁能帮我解释一下这种行为?
谢谢。
【问题讨论】:
-
你平台上的 sizeof(unsigned long) 是什么?它可能是 4 个字节。 ulong 总是 8。
-
@ta.speot.is 是的,你说得对。我不知道无符号长整数的大小在 C# 和 C++ 之间不一致。没有什么令人困惑的:)
-
不使用内置串口类的原因是什么?
-
@Gusdor DLL 用于第三方硬件 - 该函数还负责启动与设备的通信等。
-
@Alfie David 的回答有一个例子,它几乎可以肯定是你想要的,并且比我更直接地回答了这个问题。你会把他标记为正确答案吗?
标签: c# pinvoke dllimport unmanaged ulong