Ejemplo n.º 1
0
        public AssemblyDetail ExtractFrom(string assemblyFile, DiffConfig config, ref ConcurrentQueue <string> deleteFileList)
        {
            Assembly assembly;

            _assemblyFile = assemblyFile;
            _config       = config;

            // Handle standard and .winmd resolve events
            AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += CurrentDomain_ReflectionOnlyAssemblyResolve;
            WindowsRuntimeMetadata.ReflectionOnlyNamespaceResolve += WindowsRuntimeMetadata_ReflectionOnlyNamespaceResolve;

            try
            {
                if (config.UseReflectionOnlyContext)
                {
                    Log.Info("Loading assembly {0} (ReflectionContext)", assemblyFile);
                    assembly = Assembly.ReflectionOnlyLoadFrom(assemblyFile);
                }
                else
                {
                    Log.Info("Loading assembly {0}", assemblyFile);
                    assembly = Assembly.LoadFrom(assemblyFile);
                }
                var loader = new AssemblyLoader(assembly, deleteFileList);
                loader.CreateDlls(Path.GetDirectoryName(Path.GetFullPath(assemblyFile)));
                return(new AssemblyDetail(assembly));
            }
            catch (Exception ex)
            {
                var errMessage = ex.GetNestedExceptionMessage();
                Log.Error(errMessage);
                throw new Exception(errMessage);
            }
            finally
            {
                AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve -= CurrentDomain_ReflectionOnlyAssemblyResolve;
                WindowsRuntimeMetadata.ReflectionOnlyNamespaceResolve -= WindowsRuntimeMetadata_ReflectionOnlyNamespaceResolve;
            }
        }