【问题标题】:Strange C# platform invoke / DLLImport behaviour奇怪的 C# 平台调用/DLLImport 行为
【发布时间】: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


【解决方案1】:

我假设您的目标平台是 Windows,基于 DllImport 属性中的库名称。在 Windows 上,对于 32 位和 64 位,C++ long 类型(显然,无符号和有符号)都是 4 字节宽。因此,您需要使用 uint 而不是 ulong 来声明您的 p/invoke。

正确的声明是:

[DllImport("C:/my.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern uint OpenPort(
    uint ulPort, 
    uint ulBaudRate,
    uint ulByteSize, 
    uint ulParity, 
    uint ulStopBits, 
    uint ulFlowControl
);

现在,如果您的目标平台不是 Windows,那么您需要知道该平台上的 unsigned long 是什么才能给出具体建议。

【讨论】:

  • This answer 是了解后一段的更多信息的绝佳起点。
猜你喜欢
  • 2014-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多