4

我在我的项目中使用 引用了一个非托管 DLL [DLLImport],但是当我匹配方法签名时收到奇怪的结果。

这是来自 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。任何人都可以为我阐明这种行为吗?

谢谢。

4

1 回答 1

3

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

正确的声明是:

[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该平台上的内容以提供具体建议。

于 2013-11-04T12:13:54.123 回答