ITPub博客

首页 > 应用开发 > > C#调用C++DLL,传入struct

C#调用C++DLL,传入struct

作者:doudourabbit 时间:2019-08-20 11:01:28 0 删除 编辑
现在有一个C++写的DLL,有一个struct:

typedef struct USER_INFO
{
    char* user_id;
    char* user_name;
    char* user_icon;
    unsigned int user_icon_len;
}
一个函数:

int __stdcall get_user_info(void* user_info);
要在C#里调用这个函数,传入USER_INFO结构,来获取用户信息。

C#里我这么写:

    [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    public struct UserInfo
    {
        public IntPtr user_id;
        public IntPtr user_name;
        public IntPtr user_icon;
        public IntPtr user_icon_len;
    }

IntPtr infosIntptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(UserInfo)));
                i = get_user_info(infosIntptr);
UserInfo info = (UserInfo)Marshal.PtrToStructure(infosIntptr, typeof(UserInfo));
 

可以调用成功,但是用Marshal.PtrToStringAuto(info.user_name)来获取struct的属性,总是不正确,全是乱码,user_icon也不对。

后来把struct改成这样:


    [StructLayoutAttribute(LayoutKind.Sequential)]
    public struct UserInfo
    {
        [MarshalAs(UnmanagedType.ByValTStr)]
        public string user_id;
        [MarshalAs(UnmanagedType.ByValTStr)]
        public string user_name;
        [MarshalAs(UnmanagedType.ByValArray)]
        public byte[] user_icon;
        public int user_icon_len;
    }

也是无法正确取到UserInfo的字段属性,请问高手这个struct要怎么声明,怎么传参?

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4809/viewspace-3130006/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: C语言的一个题目
请登录后发表评论 登录
全部评论

注册时间:2019-04-25

  • 博文量
    193
  • 访问量
    1437