我正在尝试在我的程序中使用zabbix_sender
函数。这是我的代码:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct zabbix_sender_value_t
{
[MarshalAs(UnmanagedType.LPStr)] public String host;
[MarshalAs(UnmanagedType.LPStr)] public String key;
[MarshalAs(UnmanagedType.LPStr)] public String value;
}
[DllImport("zabbix_sender.dll", CharSet = CharSet.Ansi)]
[return: MarshalAs(UnmanagedType.U4)]
public static extern int zabbix_sender_send_values(
[param: MarshalAs(UnmanagedType.LPStr)] String address,
[param: MarshalAs(UnmanagedType.U2)] ushort port,
[param: MarshalAs(UnmanagedType.LPStr)] String source,
[param: MarshalAs(UnmanagedType.Struct)] zabbix_sender_value_t values,
[param: MarshalAs(UnmanagedType.U4)] int count,
[param: MarshalAs(UnmanagedType.LPStr)] String result
);
static void Main()
{
zabbix_sender_value_t values;
values.host = "some_hostname";
values.key = "agent.version";
values.value = "2.0.0";
string res = "";
zabbix_sender_send_values("172.16.1.1", 10051, "127.0.0.1", values, 1, res);
}
这是一个C函数的定义,我想从动态链接库中调用它:
int zabbix_sender_send_values(
const char *address,
unsigned short port,
const char *source,
const zabbix_sender_value_t *values,
int count,
char **result);
typedef struct
{
char *host;
char *key;
char *value;
}
zabbix_sender_value_t;
执行我的C#代码时出现异常:“试图读取或写入受保护的内存。这通常是其他内存已损坏的迹象。” 我尝试过很多次使用Marshalling参数,但没有成功。
这是我第一次使用本地DLL代码来编写C#程序,我真的不知道现在该怎么办。请问有什么帮助,意见或指示可以找到线索吗?
谢谢
out IntPtr
。可以使用Marshal.PtrToStringAnsi()进行转换。但非常重要的是,你不知道如何释放字符串缓冲区,所以每次调用时都可能泄漏内存。这不是一个友好的互操作函数,请使用C++/CLI。 - Hans Passant