12 Nisan 2019 Cuma

C# DLL P/Invoke CallbackOnCollectedDelegate Error


Mevcut C++ ile yazılmış bir dll projenize eklemek için ara dll oluşturarak yapacağınız Callback uygulamalarında GC callback metodunu kaldırması sorunucu çalışma aralığında CallbackOnCollectedDelegate  Exception alıp uygulama kapanmasına neden olmaktadır.

Sorun:

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate void ApplicationMessageCallback(Int32 applicationId, IntPtr data, Int32 size);

        [DllImport("xxx.dll", CallingConvention = CallingConvention.Cdecl)]
        static extern void inposext_set_application_message_callback(ApplicationMessageCallback cb);

        public static void SetApplicationMessageCallback(ApplicationMessageCallback callbackFunction)
        {

            inposext_set_application_message_callback(callbackFunction);
        }

Çözüm :

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate void ApplicationMessageCallback(Int32 applicationId, IntPtr data, Int32 size);

        [DllImport("xxx.dll", CallingConvention = CallingConvention.Cdecl)]
        static extern void inposext_set_application_message_callback(ApplicationMessageCallback cb);

        private static ApplicationMessageCallback callback;   // Keeps it referenced
        public static void SetApplicationMessageCallback(ApplicationMessageCallback callbackFunction)
        {
            callback = callbackFunction;
            inposext_set_application_message_callback(callback);
        }