如何处理非托管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 所示。
您好,我在处理非托管 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 所示。