刘奇1993 2019-04-19 21:36 采纳率: 60%
浏览 1774
已结题

C#调用dll,使用intPtr接收char*返回值不一致

在C#中调用C的dll,遇到char* 使用 intPtr接收,返回值与C中char 指针不一致

C结构体

    typedef struct
    {

            BYTE ErrCode;   
            int* errstring;

    } ERRPARAMS;

函数

    BYTE DSCUDAPICALL dscGetLastError(ERRPARAMS* errparams);

C#结构体

    [StructLayout(LayoutKind.Sequential)]
    public struct ERRPARAMS
    {
        public byte ErrCode;
        public IntPtr errstring;
    }

函数

    [DllImport("dscud.dll", EntryPoint = "dscGetLastError", CharSet = CharSet.Unicode, SetLastError = false, CallingConvention = CallingConvention.Cdecl)]
    extern unsafe public static byte dscGetLastError(ERRPARAMS* errparams);

执行结果:
在C中 ErrCode是5 errstring是0x1007eb80 可以转换成字符串

在C#中 ErrCode是5 errstring是0x00000010 使用Marshal.PtrToStringAnsi转换为空,不是想要的地址

将intPtr改成string/String/StringBuilder/char[]都试过了,函数会报内存异常的错误。

且大神解答,非常感谢。

  • 写回答

2条回答

  • threenewbee 2019-04-19 23:44
    关注

    extern public static IntPtr dscGetErrorString(byte error_code);
    应该是
    extern unsafe public static IntPtr dscGetErrorString(ERRPARAMS * param);
    将程序集设置为允许不安全代码

    评论

报告相同问题?

悬赏问题

  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题
  • ¥15 Python时间序列如何拟合疏系数模型
  • ¥15 求学软件的前人们指明方向🥺
  • ¥50 如何增强飞上天的树莓派的热点信号强度,以使得笔记本可以在地面实现远程桌面连接