private unsafe IntPtr CreateUnmanagedInstance() { // TODO: this potentially leaks memory, but since we only expect to have one per compilation, // it shouldn't matter... const int numCallbacks = 2; IntPtr *callbacks = (IntPtr *)Marshal.AllocCoTaskMem(sizeof(IntPtr) * numCallbacks); object[] delegates = new object[numCallbacks]; var d0 = new __getIntConfigValue(getIntConfigValue); callbacks[0] = Marshal.GetFunctionPointerForDelegate(d0); delegates[0] = d0; var d1 = new __getStringConfigValue(getStringConfigValue); callbacks[1] = Marshal.GetFunctionPointerForDelegate(d1); delegates[1] = d1; _keepAlive = delegates; IntPtr instance = Marshal.AllocCoTaskMem(sizeof(IntPtr)); *(IntPtr **)instance = callbacks; return(instance); }
private unsafe IntPtr CreateUnmanagedInstance() { // TODO: this potentially leaks memory, but since we only expect to have one per compilation, // it shouldn't matter... const int numCallbacks = 2; IntPtr* callbacks = (IntPtr*)Marshal.AllocCoTaskMem(sizeof(IntPtr) * numCallbacks); object[] delegates = new object[numCallbacks]; var d0 = new __getIntConfigValue(getIntConfigValue); callbacks[0] = Marshal.GetFunctionPointerForDelegate(d0); delegates[0] = d0; var d1 = new __getStringConfigValue(getStringConfigValue); callbacks[1] = Marshal.GetFunctionPointerForDelegate(d1); delegates[1] = d1; _keepAlive = delegates; IntPtr instance = Marshal.AllocCoTaskMem(sizeof(IntPtr)); *(IntPtr**)instance = callbacks; return instance; }