奇怪的C#平台调用/DLLImport行为

奇怪的C#平台调用/DLLImport行为,c#,pinvoke,dllimport,unmanaged,ulong,C#,Pinvoke,Dllimport,Unmanaged,Ulong,我在项目中使用[DLLImport]引用了一个非托管DLL,但在匹配方法签名时收到了奇怪的结果 以下是来自DLL的签名示例: DLLEXPORT unsigned long OpenPort(unsigned long ulPort, unsigned long ulBaudRate, unsigned long ulByteSize,

我在项目中使用
[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
,该函数将工作并返回预期结果。有人能为我解释一下这种行为吗


谢谢。

根据
DllImport
属性中库的名称,我假设您的目标平台是Windows。在Windows上,对于32位和64位,C++ <代码>长< /Cord>类型(无符号以及签名,显然)是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,那么您需要知道该平台上有什么
未签名的long
,才能给出具体建议。

您的平台上的sizeof(未签名的long)是多少?可能是4个字节。ulong总是8.@ta.speot.is是的,你是对的。。我不知道C和C++之间的无符号长的大小是不一致的。没有什么令人困惑的:)不使用内置串行端口类的原因是什么?@Gusdor DLL用于第三方硬件-该函数还负责启动与设备的通信等。@Alfie David的答案有一个几乎可以肯定是您想要的示例,并且比其他示例更直接地回答了这个问题矿你能把他标为正确答案吗?这是关于后一段的更多信息的极好起点。