예제 #1
0
        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)));
        }