c#
プログラムでzabbix_sender
関数を使用しようとしています。ここに私のc#
コードです:C#からC DLLを呼び出すと、保護されたメモリを読み書きしようとしました
[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関数の定義があり、私はDLLから呼び出すしようとしている:私の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;
実行は例外で終わる「読み取りまたは書き込みをしようとしましたこれはしばしば他のメモリが壊れていることを示しています。
私はマーシャルパラメータで多くの演奏をしましたが、運はありません。
初めて私は使用するネイティブDLL
コードc#
プログラムで直面しており、私は本当に何をしなければならないのか分かりません。
手がかりを見つけるには、どんな助けを求めても、異議を申し出てください。
おかげ
最も明白な間違いは*値*引数である、あなたがzabbix_sender_value_tを取得する* * REFとして宣言する必要があり*:ここでは
は私の最終的なコードです。 * result *の引数は非常に面倒ですが、文字列は不変なので、* string *として宣言することはできません。 char **はあいまいです。文字列の配列である可能性があります。おそらく解釈は 'Out IntPtr'です。 Marshal.PtrToStringAnsi()に変換されました。非常に重要なハングアップでは、文字列バッファを解放する方法がわからないので、呼び出すたびにメモリがリークする可能性があります。これはinterop-friendly関数ではなく、C++/CLIを使用します。 –