u011124078
刘奇1993
采纳率60%
2019-04-19 21:36 浏览 1.4k

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

5

在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条回答 默认 最新

  • caozhy 从今以后生命中的每一秒都属于我爱的人 2019-04-19 23:44

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

    点赞 评论 复制链接分享
  • qq451763407 qq451763407 2019-04-21 14:52

    别人的DLL程序 里有2个不同的方法

    点赞 评论 复制链接分享

相关推荐