static NativeMethods() { IntPtr image; if (PlatformDetails.IsMac) { image = LibraryLoader.Load(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Audio", "Codecs", "Opus", "Libs", "32bit", "libopus.dylib")); } else if (PlatformDetails.IsWindows) { if (!Environment.Is64BitProcess) { image = LibraryLoader.Load(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Audio", "Codecs", "Opus", "Libs", "32bit", "opus.dll")); } else { image = LibraryLoader.Load(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Audio", "Codecs", "Opus", "Libs", "64bit", "opus.dll")); } } else { image = LibraryLoader.Load("libopus.so.0"); if (image.Equals(IntPtr.Zero)) { image = LibraryLoader.Load(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Audio", "Codecs", "Opus", "Libs", "libopus.so")); } } if (image != IntPtr.Zero) { var type = typeof(NativeMethods); foreach (var member in type.GetFields(BindingFlags.Static | BindingFlags.NonPublic)) { var methodName = member.Name; if (methodName == "opus_encoder_ctl_out") { methodName = "opus_encoder_ctl"; } var fieldType = member.FieldType; var ptr = LibraryLoader.ResolveSymbol(image, methodName); if (ptr == IntPtr.Zero) { throw new Exception(string.Format("Could not resolve symbol \"{0}\"", methodName)); } member.SetValue(null, Marshal.GetDelegateForFunctionPointer(ptr, fieldType)); } } }