如何处理非托管dll和C#之间的内容

How to handle the content between unmanaged dll and C#

您好,我在处理非托管 dll 和我的 C# 代码之间的信息时遇到了问题。

我的C dll中的函数是:

int import_large_string(struct sha_struct *sha_s,
                   const char *large_string);

导入large_string并转换为sha_s,结构sha_s结构如下:

struct sha_struct 
{
    struct information  *info;
    struct info_cfg cfg;
};

信息结构类似于

struct information 
{
int             version;
char            serial_number[16];
uint16_t        exp_date;
};

在 C# 中,我像这样导入函数 import_large_string:

[DllImport("functionalDLL.dll", EntryPoint = "import_large_string", CharSet = CharSet.Ansi)]
public static int import_large_string(ref sha_struct sha_s, string large_string);

当我调用该函数时,它假设将信息存储在 sha_struct sha_s 中,但我在 sha_s.information.version 中只有一个随机的 8 位数字,而不是在整个结构中,我做错了什么?

Edited

My structs in C# are:

    [StructLayout(LayoutKind.Sequential)]
    public struct sha_struct
    {
        public information t;
        public info_cfg cfg;
    };

    [StructLayout(LayoutKind.Sequential)]
    public struct information
    {
        public int version;
        public string serial_number;
        public ushort exp_date;
    };

    [StructLayout(LayoutKind.Sequential)]
    public struct info_cfg
    {
        public string release_version;
        public string release_string;
        public string release_password;
    };

正如@DavidHeffernan 所指出的,您想在字符串字段上使用 MarshalAs 属性:

[StructLayout(LayoutKind.Sequential)]
    public struct information
    {
        public int version;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst=16)]
        public string serial_number;
        public ushort exp_date;
    };

this documentation link 所示。