public static bool IsAvailable() { if (_method != null && _isCovered != null) { return(true); } if (_ran) { return(false); } _ran = true; try { System.Type type = AssemblyLoader.loadedAssemblies.SelectMany((AssemblyLoader.LoadedAssembly loaded) => loaded.assembly.GetExportedTypes()).SingleOrDefault((System.Type t) => t.FullName == "SCANsat.SCANUtil"); bool result; if (type == null) { result = false; return(result); } _method = type.GetMethod("isCovered", new System.Type[] { typeof(double), typeof(double), typeof(CelestialBody), typeof(int) }); if (_method == null) { result = false; return(result); } _isCovered = (IsCoveredDelegate)System.Delegate.CreateDelegate(typeof(IsCoveredDelegate), _method); Log.Debug(_isCovered == null ? "[ScienceAlert]:SCANsatInterface: Failed to create method delegate" : "[ScienceAlert]:SCANsatInterface: Interface available"); result = _isCovered != null; return(result); } catch (System.Exception ex) { Log.Debug("[ScienceAlert]:Exception in SCANsatInterface.IsAvailable: {0}", ex); } return(false); }
private void InitializeScansatIntegration() { var scanutil = AssemblyLoader.loadedAssemblies.SelectMany(x => x.assembly.GetExportedTypes()) .FirstOrDefault(x => x.FullName == "SCANsat.SCANUtil"); var scandata = AssemblyLoader.loadedAssemblies.SelectMany(x => x.assembly.GetExportedTypes()) .FirstOrDefault(x => x.FullName == "SCANsat.SCANdata"); if (scanutil != null && scandata != null) { var method = scanutil.GetMethod("isCovered", new[] { typeof(double), typeof(double), typeof(CelestialBody), typeof(int) }); if (method != null) { _scansatIsCoveredDelegate = (IsCoveredDelegate)Delegate.CreateDelegate(typeof(IsCoveredDelegate), method); } _scansatEnum = scandata.GetNestedType("SCANtype"); } }
/// <summary> /// Checks to ensure the SCANsat interface is available /// </summary> /// <returns></returns> public static bool IsAvailable() { if (_method != null && _isCovered != null) { return(true); } if (_ran) { //Log.Debug("SCANsatInterface.IsAvailable already ran; not available."); return(false); } Log.Verbose("Performing SCANsat check..."); _ran = true; try { Type utilType = AssemblyLoader.loadedAssemblies .SelectMany(loaded => loaded.assembly.GetExportedTypes()) .SingleOrDefault(t => t.FullName == SCANutilTypeName); #if DEBUG AssemblyLoader.loadedAssemblies.ToList().ForEach(a => { if (a.name == "SCANsat") { Log.Debug("Assembly {0}:", a.assembly.FullName); a.assembly.GetExportedTypes().ToList().ForEach(t => { Log.Debug(" exports: {0}", t.FullName); }); } else { Log.Debug("Assembly [brief]: {0}", a.name); } }); #endif if (utilType == null) { Log.Warning("SCANsatInterface.IsAvailable: Failed to find SCANsat.SCANutil type. SCANsat interface will not be available."); return(false); } _method = utilType.GetMethod("isCovered", new Type[] { typeof(double), typeof(double), typeof(CelestialBody), typeof(int) }); if (_method == null) { Log.Error("SCANsatInterface: Failed to locate SCANutil.isCovered!"); return(false); } else { _isCovered = (IsCoveredDelegate)Delegate.CreateDelegate(typeof(IsCoveredDelegate), _method); if (_isCovered == null) { Log.Error("SCANsatInterface: Failed to create method delegate"); } else { Log.Normal("SCANsatInterface: Interface available"); } return(_isCovered != null); } } catch (Exception e) { Log.Error("Exception in SCANsatInterface.IsAvailable: {0}", e); } return(false); }