static IntPtr dlsym(IntPtr handle, string symbol) { if (Platform.RunningOS == OS.Linux) { return(LinuxInterop.dlsym(handle, symbol)); } else { return(MacInterop.dlsym(handle, symbol)); } }
public static T GetLibraryDelegate <T>(IntPtr handler) { string functionName = null; var procAddress = IntPtr.Zero; var supportedPlatform = UMPSettings.RuntimePlatform; try { var attrs = typeof(T).GetCustomAttributes(typeof(NativeFunctionAttribute), false); if (attrs.Length == 0) { throw new Exception("[GetLibraryDelegate] Could not find the native attribute type."); } var attr = (NativeFunctionAttribute)attrs[0]; functionName = attr.FunctionName; if (_interopDelegates.ContainsKey(functionName)) { return((T)Convert.ChangeType(_interopDelegates[attr.FunctionName], typeof(T), null)); } if (supportedPlatform == UMPSettings.Platforms.Win) { procAddress = WindowsInterop.GetProcAddress(handler, attr.FunctionName); } if (supportedPlatform == UMPSettings.Platforms.Mac) { procAddress = MacInterop.dlsym(handler, attr.FunctionName); } if (supportedPlatform == UMPSettings.Platforms.Linux) { procAddress = LinuxInterop.dlsym(handler, attr.FunctionName); } if (procAddress == IntPtr.Zero) { throw new Exception(string.Format("[GetLibraryDelegate] Can't get process address from '{0}'", handler)); } var delegateForFunctionPointer = Marshal.GetDelegateForFunctionPointer(procAddress, typeof(T)); _interopDelegates[attr.FunctionName] = delegateForFunctionPointer; return((T)Convert.ChangeType(delegateForFunctionPointer, typeof(T), null)); } catch (Exception e) { throw new MissingMethodException(string.Format("[GetLibraryDelegate] The address of the function '{0}' does not exist in '{1}' library.", functionName, handler), e); } }