private static IntPtr RuntimeStartupCallback(object parameter, RuntimeStartupCallbackDelegate callback, out IntPtr nativeParameter) { NativeRuntimeStartupCallbackDelegate native = (IntPtr cordbg, IntPtr param, HResult hresult) => { GCHandle gch = GCHandle.FromIntPtr(param); callback(ICorDebug.Create(cordbg), gch.Target, hresult); gch.Free(); }; GCHandle gchParameter = GCHandle.Alloc(parameter); nativeParameter = GCHandle.ToIntPtr(gchParameter); return(Marshal.GetFunctionPointerForDelegate(native)); }
private static IntPtr RuntimeStartupCallback(object parameter, RuntimeStartupCallbackDelegate callback, out GCHandle nativeCallbackHandle, out IntPtr nativeParameter) { NativeRuntimeStartupCallbackDelegate native = (IntPtr cordbg, IntPtr param, HResult hresult) => { GCHandle gch = GCHandle.FromIntPtr(param); callback(ICorDebug.Create(cordbg), gch.Target, hresult); gch.Free(); }; // Need to keep native callback delegate alive until UnregisterForRuntimeStartup nativeCallbackHandle = GCHandle.Alloc(native); // Need to keep parameter alive until the callback is invoked GCHandle gchParameter = GCHandle.Alloc(parameter); nativeParameter = GCHandle.ToIntPtr(gchParameter); // Return the function pointer for the native callback return(Marshal.GetFunctionPointerForDelegate(native)); }
public static HResult RegisterForRuntimeStartupEx(int pid, string applicationGroupId, object parameter, out IntPtr unregisterToken, RuntimeStartupCallbackDelegate callback) { IntPtr nativeCallback = RuntimeStartupCallback(parameter, callback, out IntPtr nativeParameter); return(_registerForRuntimeStartupEx((uint)pid, applicationGroupId, nativeCallback, nativeParameter, out unregisterToken)); }
public static HResult RegisterForRuntimeStartup3(int pid, string applicationGroupId, object parameter, IntPtr libraryProvider, out IntPtr unregisterToken, RuntimeStartupCallbackDelegate callback) { if (_registerForRuntimeStartup3 == default) { throw new NotSupportedException("RegisterForRuntimeStartup3 not supported"); } IntPtr nativeCallback = RuntimeStartupCallback(parameter, callback, out IntPtr nativeParameter); return(_registerForRuntimeStartup3((uint)pid, applicationGroupId, libraryProvider, nativeCallback, nativeParameter, out unregisterToken)); }
public static HResult RegisterForRuntimeStartupEx(int pid, string applicationGroupId, object parameter, out (IntPtr, GCHandle) unregister, RuntimeStartupCallbackDelegate callback) { IntPtr nativeCallback = RuntimeStartupCallback(parameter, callback, out GCHandle nativeCallbackHandle, out IntPtr nativeParameter); HResult hr = _registerForRuntimeStartupEx((uint)pid, applicationGroupId, nativeCallback, nativeParameter, out IntPtr unregisterToken); unregister = (unregisterToken, nativeCallbackHandle); return(hr); }
public static HResult RegisterForRuntimeStartup(int pid, object parameter, out (IntPtr, GCHandle) unregister, RuntimeStartupCallbackDelegate callback) { IntPtr nativeCallback = RuntimeStartupCallback(parameter, callback, out GCHandle gchNativeCallback, out IntPtr nativeParameter); HResult hr = _registerForRuntimeStartup((uint)pid, nativeCallback, nativeParameter, out IntPtr unregisterToken); unregister = (unregisterToken, gchNativeCallback); return(hr); }