public static void SubscribeToNetworkEvents(RealPlugin p) { try { object plug = GetInstance(); if (plug == null) { throw new ArgumentException("No plugin instance available"); } PropertyInfo pi = plug.GetType().GetProperty("DataSubscription", BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); if (pi == null) { throw new ArgumentException("No DataSubscription found"); } dynamic subs = pi.GetValue(plug); if (subs == null) { throw new ArgumentException("DataSubscription not initialized"); } EventInfo ei = subs.GetType().GetEvent("ParsedLogLine", BindingFlags.GetField | BindingFlags.Public | BindingFlags.Instance); if (subs == null) { throw new ArgumentException("No ParsedLogLine found"); } MethodInfo mix = p.GetType().GetMethod("NetworkLogLineReceiver"); Type deltype = ei.EventHandlerType; Delegate handler = Delegate.CreateDelegate(deltype, p, mix); ei.AddEventHandler(subs, handler); LogMessage(RealPlugin.DebugLevelEnum.Info, I18n.Translate("internal/ffxiv/networksubok", "Subscribed to FFXIV network events")); } catch (Exception ex) { LogMessage(RealPlugin.DebugLevelEnum.Error, I18n.Translate("internal/ffxiv/networksubexception", "Could not subscribe to FFXIV network events due to an exception: {0}", ex.Message)); } }
internal MethodInfo GetImplMethodInfo(Type interfaceType, string methodName) { Debug.Assert(RealPlugin != null); MethodInfo m = RealPlugin.GetType().GetMethod(interfaceType.FullName + '.' + methodName); if (m == null) { m = RealPlugin.GetType().GetMethod(methodName, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); } return(m); }