public async Task Post([FromBody] TransportableModule transportableModule) { if (transportableModule == null) { throw new ArgumentNullException(nameof(transportableModule)); } var rootOutput = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Rice", "RiceConsole"); var directoryPath = Path.Combine(rootOutput, $"{DateTime.Now:yyyy.MM.dd.HH.mm.ss.ffff}"); Directory.CreateDirectory(directoryPath); try { await _tranportableModuleWriter.WriteToFile(directoryPath, transportableModule); var fullPathToDll = Path.Combine(directoryPath, $"{transportableModule.AssemblyName}.dll"); var loadableModule = _loadableModuleFactory.Create(transportableModule.AssemblyName, fullPathToDll); var module = _moduleLoader.GetModule(loadableModule); var result = module.Execute(null); } catch (Exception e) { Console.WriteLine(e); } }
public IEnumerable <IAnalyserResult> AnalyseAssembly(IModuleLoader loader) { var result = new List <DependencyResult>(); var references = new List <TypeReference>(); var loadedModules = new List <ModuleDefinition>(); var unloadedModules = new Queue <string>(); unloadedModules.Enqueue(null); while (unloadedModules.Count > 0) { var moduleName = unloadedModules.Dequeue(); var module = loader.GetModule(moduleName); if (module == null) { continue; } var deps = GetDependencies(module).ToList(); references.AddRange(deps); loadedModules.Add(module); foreach (var scopeName in deps.SelectMany(d => d.References.Select(dd => dd.Scope)).Distinct()) { if (InternalModules.Contains(scopeName)) { continue; } if (loadedModules.Any(m => m.Name == scopeName)) { continue; } if (unloadedModules.Contains(scopeName)) { continue; } unloadedModules.Enqueue(scopeName); } } if (references.Any()) { result = Mapper.MapResults(references) .Select(r => new DependencyResult { Definition = r }).ToList(); } return(result); }
/// <summary> /// Analyses the assembly. /// </summary> /// <returns></returns> public IEnumerable <IAnalyserResult> AnalyseAssembly(IModuleLoader loader) { var module = loader.GetModule(); var calls = (from type in module.Types from caller in type.Methods where caller != null && caller.Body != null from instruction in caller.Body.Instructions where instruction.OpCode == OpCodes.Call let called = instruction.Operand as MethodReference select new CallProfile { Type = type, Caller = caller, Called = called }).Distinct().ToList(); var stacks = GetRecursives(calls); return(stacks.Select(s => new RecursiveResult(s))); }