永続的な AccessViolationException を修正する助けが必要です。
このような AC 署名が与えられた場合
struct message {
char *topic;
void *payload;
int payloadlen;
};
__declspec(dllexport) void callback_set(struct data *dat, void (*on_publish)(struct data *, void *, const struct message *));
私はこのC#を持っています
public struct message
{
public string topic;
public IntPtr payload;
public int payloadlen;
};
/* INTEROP ACCESS */
public delegate void on_publish(IntPtr dat, IntPtr usrData, IntPtr messageData);
[DllImport(dllPath, CallingConvention = CallingConvention.Cdecl)]
public extern static void callback_set(IntPtr dat, IntPtr callback);
/* IMPLEMENTATION OF OUR on_publish*/
public static void MessageHandler(IntPtr dat, IntPtr usrData, IntPtr messageData)
{
var instance = (message)Marshal.PtrToStructure(messageData, typeof(message));
string test = instance.topic; // <-- this is successfully received
Console.WriteLine("message rec " + test);
} //<-- as soon as I exit, the dll blows up with access violation
/* REGISTERING MESSAGEHANDLER AS ON_PUBLISH */
public static void RegisterMessageHandler(IntPtr dat) //<-- I promise, the pointer I send here is valid and not modified
{
messageHandler = new on_publish(MessageHandler);
messageHandlerPtr = Marshal.GetFunctionPointerForDelegate(messageHandler);
callback_set(dat, messageHandlerPtr); //<-- if I do not call this, everything works, no ADE
Console.WriteLine("message handler registered");
}
//just tried to move to scope in order to retain their managed memory loc
private static IntPtr messageHandlerPtr;
private static on_publish messageHandler;
実行中に、メッセージを受信する必要があることを確認します - の正しい文字列を取得しますが、戻るtopic
とすぐMessageHandler
に恐ろしい例外が発生します。
私が試したこと:
- CallingConvention の変更
- マネージド callback_set 定義で IntPtr の代わりに on_publish を使用する
- おそらく、影響を与えるべきではない必死のものがもっと多い
どんな助けでも大歓迎です!
誰かが助けてくれれば、プロジェクトの zip を共有できます。これは、相互運用しようとしている Mosquitto と同じように BSD ライセンスになります。