Exemplo n.º 1
0
        // Loads the Assembly with the specified name at the specified optional location.
        //
        // assemblyName is either short name or full name.
        // assemblyPath is either full file path or null.
        //
        private static Assembly LoadAssemblyHelper(string assemblyGivenName, string assemblyPath)
        {
            AssemblyName assemblyName      = new AssemblyName(assemblyGivenName);
            string       assemblyShortName = assemblyName.Name;

            assemblyShortName = assemblyShortName.ToUpper(CultureInfo.InvariantCulture);

            // Check if the assembly has already been loaded.
            Assembly retassem = (Assembly)_loadedAssembliesHash[assemblyShortName];

            if (retassem != null)
            {
                if (assemblyName.Version != null)
                {
                    AssemblyName cachedName = new AssemblyName(retassem.FullName);
                    if (!AssemblyName.ReferenceMatchesDefinition(assemblyName, cachedName))
                    {
                        string request = assemblyName.ToString();
                        string found   = cachedName.ToString();
                        throw new InvalidOperationException(SR.Get(SRID.ParserAssemblyLoadVersionMismatch, request, found));
                    }
                }
            }
            else
            {
                // Check if the current AppDomain has this assembly loaded for some other reason.
                // If so, then just use that assembly and don't attempt to load another copy of it.
                // Only do this if no path is provided.
                if (String.IsNullOrEmpty(assemblyPath))
                {
                    retassem = SafeSecurityHelper.GetLoadedAssembly(assemblyName);
                }

                if (retassem == null)
                {
                    if (!String.IsNullOrEmpty(assemblyPath))
                    {
                        // assemblyPath is set, Load the assembly from this specified place.
                        // the path must be full file path which contains directory, file name and extension.
                        Debug.Assert(!assemblyPath.EndsWith("\\", StringComparison.Ordinal), "the assembly path should be a full file path containing file extension");

                        // LoadFile will only override your request only if it is in the GAC
                        retassem = Assembly.LoadFile(assemblyPath);
                    }
                    //
                    // At compile time, the build task should always pass the full path of the referenced assembly, even if it
                    // comes from GAC. But below code snippet can run if parser wants to try loading an assembly w/o a path.
                    // This also makes run-time assembly load consistent with compile-time semantics.
                    else
                    {
                        try
                        {
                            retassem = Assembly.Load(assemblyGivenName);
                        }
                        catch (System.IO.FileNotFoundException)
                        {
                            // This may be a locally defined assembly that has not been created yet.
                            // To support these cases, just set a null assembly and return.  This
                            // will fail downstream if it really was an assembly miss.
                            retassem = null;
                        }
                    }
                }

                // Cache the assembly
                if (retassem != null)
                {
                    _loadedAssembliesHash[assemblyShortName] = retassem;
                }
            }

            return(retassem);
        }
Exemplo n.º 2
0
        private static void PreLoad()
        {
            var files = new List <string>();
            var p     = AppDomain.CurrentDomain.BaseDirectory;

            //files.AddRange(Directory.GetFiles(p, "db2app64.dll", SearchOption.TopDirectoryOnly).ToList());
            files.AddRange(Directory.GetFiles(p, "IBM.Data.DB2.dll", SearchOption.TopDirectoryOnly).ToList());
            files.AddRange(Directory.GetFiles(p, "MySql.Data.dll", SearchOption.TopDirectoryOnly).ToList());
            files.AddRange(Directory.GetFiles(p, "Npgsql.dll", SearchOption.TopDirectoryOnly).ToList());
            files.AddRange(Directory.GetFiles(p, "Mono.Security.dll", SearchOption.TopDirectoryOnly).ToList());
            files.AddRange(Directory.GetFiles(p, "System.Data.SQLite.dll", SearchOption.TopDirectoryOnly).ToList());
            files.AddRange(Directory.GetFiles(p, "Oracle.ManagedDataAccess.dll", SearchOption.TopDirectoryOnly).ToList());
            foreach (var s in files)
            {
                AssemblyName a = null;
                try
                {
                    a = AssemblyName.GetAssemblyName(s);
                }
                catch
                {
                    string info = string.Format("AppDomain can't load file {0}", s);
                    LogHelper.LogWarning(info);
                    continue;
                }

                if (!AppDomain.CurrentDomain.GetAssemblies().Any(
                        assembly
                        =>
                        AssemblyName.ReferenceMatchesDefinition(assembly.GetName(), a))
                    )
                {
                    try
                    {
                        Assembly assembly;
                        if (Path.GetFileName(s) == "System.Data.SQLite.dll")
                        {
                            assembly = Assembly.UnsafeLoadFrom(s);
                        }
                        else
                        {
                            assembly = Assembly.LoadFrom(s);
                        }

                        var assemblyName = assembly.FullName.Split(',')[0];
                        if (assemblyName == "System.Data.SQLite")
                        {
                            Drivers.Add(DataBaseNames.Sqlite, assembly);
                        }
                        else if (assemblyName == "Npgsql")
                        {
                            Drivers.Add(DataBaseNames.PostgreSql, assembly);
                        }
                        else if (assemblyName == "MySql.Data")
                        {
                            Drivers.Add(DataBaseNames.MySql, assembly);
                        }
                        else if (assemblyName == "IBM.Data.DB2")
                        {
                            Drivers.Add(DataBaseNames.Db2, assembly);
                        }
                        else if (assemblyName == "Oracle.ManagedDataAccess")
                        {
                            Drivers.Add(DataBaseNames.Oracle, assembly);
                        }
                    }
                    catch
                    {
                        string info = string.Format("AppDomain can't load file {0}", s);
                        LogHelper.LogWarning(info);
                    }
                }
            }
        }
Exemplo n.º 3
0
        public override ICollection <Assembly> GetAssemblies()
        {
            List <string> assemblyNames = new List <string>()
            {
                "FSTWebApi.dll"
            };

            if (null != assemblyNames)
            {
                foreach (var item in assemblyNames)
                {
                    AssemblyName assemblyName = AssemblyName.GetAssemblyName(item);
                    if (!AppDomain.CurrentDomain.GetAssemblies().Any <Assembly>(assembly => AssemblyName.ReferenceMatchesDefinition(assembly.GetName(), assemblyName)))
                    {
                        AppDomain.CurrentDomain.Load(assemblyName);
                    }
                }
            }
            return(base.GetAssemblies());
        }
        // Token: 0x060008FC RID: 2300 RVA: 0x00040D1C File Offset: 0x0003EF1C
        private void ProcessAssembly(string fileName)
        {
            PluginsFactory <T> .log.DebugFormat("Loading plugins from {0}", fileName);

            AssemblyName assemblyName = AssemblyName.GetAssemblyName(fileName);
            Assembly     assembly     = null;

            foreach (Assembly assembly2 in AppDomain.CurrentDomain.ReflectionOnlyGetAssemblies())
            {
                if (AssemblyName.ReferenceMatchesDefinition(assembly2.GetName(), assemblyName))
                {
                    assembly = assembly2;
                    try
                    {
                        string fullPath = Path.GetFullPath(new Uri(assembly.CodeBase).LocalPath);
                        if (!StringComparer.OrdinalIgnoreCase.Equals(fileName, fullPath))
                        {
                            PluginsFactory <T> .log.WarnFormat("inspecting [{0}] at '{1}' as [{2}] at '{3}'", new object[]
                            {
                                assemblyName,
                                fileName,
                                assembly,
                                fullPath
                            });
                        }
                        break;
                    }
                    catch (Exception ex)
                    {
                        PluginsFactory <T> .log.WarnFormat("inspecting [{0}] at '{1}' as [{2}]. {3}", new object[]
                        {
                            assemblyName,
                            fileName,
                            assembly,
                            ex
                        });

                        break;
                    }
                }
            }
            if (assembly == null)
            {
                assembly = Assembly.ReflectionOnlyLoadFrom(fileName);
            }
            List <Type> list = PluginsFactory <T> .FindDerivedTypes <T>(assembly);

            if (list.Count != 0)
            {
                list = PluginsFactory <T> .FindDerivedTypes <T>(Assembly.LoadFrom(fileName));
            }
            foreach (Type type in list)
            {
                PluginsFactory <T> .log.DebugFormat("Creating plugin for {0}", type);

                T t = (T)((object)Activator.CreateInstance(type));
                this.Plugins.Add(t);
                string       text     = string.Empty;
                PropertyInfo property = t.GetType().GetProperty("FlagName");
                if (property != null)
                {
                    text = (string)property.GetValue(t, null);
                }
                if (PluginsFactory <T> .log.IsInfoEnabled)
                {
                    PluginsFactory <T> .log.InfoFormat("Loaded plugin {0} for {1} from {2}", type, text, fileName);
                }
            }
        }
Exemplo n.º 5
0
        /// <summary>
        /// Return a list of all referenced assemblies
        /// </summary>
        /// <param name="entry"></param>
        /// <param name="set"></param>
        /// <returns></returns>
        private static HashSet <Assembly> GetUniqueNestedReferencedAssemblies(Assembly entry, AssemblyName executing, HashSet <Assembly> set = null)
        {
            if (set == null)
            {
                set = new HashSet <Assembly>();
            }

            if (set.Add(entry))
            {
                foreach (Assembly child in entry.GetReferencedAssemblies().Where(an => AssemblyName.ReferenceMatchesDefinition(an, executing) || Assembly.Load(an).GetReferencedAssemblies().Any(nan => AssemblyName.ReferenceMatchesDefinition(nan, executing))).Select(an => Assembly.Load(an)))
                {
                    AssemblyHelper.GetUniqueNestedReferencedAssemblies(child, executing, set);
                }
            }

            return(set);
        }
Exemplo n.º 6
0
 public static void ReferenceMatchesDefinition(AssemblyName a1, AssemblyName a2, bool expected)
 {
     Assert.Equal(expected, AssemblyName.ReferenceMatchesDefinition(a1, a2));
 }
Exemplo n.º 7
0
        private static void PreLoadAssemblies()
        {
            var entry = Assembly.GetEntryAssembly();
            var referencedAssemblies = entry.GetReferencedAssemblies();

            var microAssembly     = typeof(MicroServiceCollectionExtension).Assembly;
            var microAssemblyName = microAssembly.GetName();

            var loadedAssemblyNames = _allAssemblies.Select(a => a.GetName());
            var assemblyFiles       = Directory.GetFiles(Directory.GetCurrentDirectory(), "*.dll", SearchOption.AllDirectories);

            var assemblyFilesAndNames = new List <dynamic>();

            foreach (var file in assemblyFiles)
            {
                try
                {
                    var name = AssemblyName.GetAssemblyName(file);
                    var p    = file;
                    assemblyFilesAndNames.Add(new { Name = name, Path = p });
                }
                catch
                {
                }
            }

            var assembliesToLoad = assemblyFilesAndNames.Where(f => !loadedAssemblyNames.Any(lf => AssemblyName.ReferenceMatchesDefinition(lf, f.Name))).ToList();

            foreach (var assembly in assembliesToLoad)
            {
                try
                {
                    Assembly.LoadFrom(assembly.Path);
                }
                catch
                {
                }
            }
        }
Exemplo n.º 8
0
 private bool StrictReferenceMatchesDefinition(AssemblyName reference, AssemblyName definition)
 {
     return(AssemblyName.ReferenceMatchesDefinition(reference, definition) &&
            reference.Version.Equals(definition.Version) &&
            Enumerable.SequenceEqual(reference.GetPublicKeyToken(), definition.GetPublicKeyToken()));
 }
Exemplo n.º 9
0
        static Assemblies()
        {
            List <Assembly> all = new List <Assembly>();

            foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies())
            {
                //这里只加载了当前运行所需要的程序集,未必是全部。
                AddAssembly(all, a);
            }
            if (HttpContext.Current != null)
            {
                foreach (Assembly a in BuildManager.GetReferencedAssemblies())
                {
                    if (!all.Any(loaded =>
                                 AssemblyName.ReferenceMatchesDefinition(loaded.GetName(), a.GetName())))
                    {
                        AddAssembly(all, a);
                    }
                }
                string binDir = HttpRuntime.BinDirectory;
                if (!string.IsNullOrEmpty(binDir))
                {
                    string[] files = Directory.GetFiles(binDir, "*.dll", SearchOption.TopDirectoryOnly);
                    foreach (string file in files)
                    {
                        if (file.StartsWith("WebApi", StringComparison.OrdinalIgnoreCase))
                        {
                            AssemblyName name = AssemblyName.GetAssemblyName(file);
                            Assembly     a    = Assembly.Load(name);
                            if (!all.Any(loaded =>
                                         AssemblyName.ReferenceMatchesDefinition(loaded.GetName(), name)))
                            {
                                AddAssembly(all, a);
                            }
                        }
                    }
                }
            }
            else
            {
                //为了单元测试
                var dir = AppDomain.CurrentDomain.BaseDirectory;
                if (!string.IsNullOrEmpty(dir))
                {
                    var dirInfo = new DirectoryInfo(dir);
                    var files   = dirInfo.GetFiles("*.dll", SearchOption.TopDirectoryOnly);
                    foreach (var file in files)
                    {
                        if (file.Name.StartsWith("WebApi", StringComparison.OrdinalIgnoreCase))
                        {
                            AssemblyName name = AssemblyName.GetAssemblyName(file.Name);
                            Assembly     a    = Assembly.Load(name);
                            if (!all.Any(loaded =>
                                         AssemblyName.ReferenceMatchesDefinition(loaded.GetName(), name)))
                            {
                                AddAssembly(all, a);
                            }
                        }
                    }
                }
            }
            _all = new ReadOnlyCollection <Assembly>(all);
        }
        /// <inheritdoc />
        protected override Assembly?Load(AssemblyName assemblyName)
        {
            Assembly?a = null;

            // if the assembly is in SharedAssembies then we use that assembly first
            a = ALCContext.SharedAssemblies
                .Where(x => AssemblyName.ReferenceMatchesDefinition(x.GetName(), assemblyName))
                .FirstOrDefault();
            if (a != null)
            {
                return(a);
            }

            // if the assembly is in dependented plugins
            // then we use the assembly in the assembly in dependented plugin
            // ========= [mark]  =============================
            // should we only use the plugin's entryAssemlby?
            // or we add [ExportedAssemlby] in PluginInfo
            // or we use some attribute like [ExportAttribute] to detect all it's dependented assembly
            // ===============================================
            foreach (var alc in ALCContext.Plugins)
            {
                a = alc.Value.LoadFromAssemblyName(assemblyName);
                if (a != null)
                {
                    return(a);
                }
            }


            // load the dependency from our only
            var path = Resolver?.ResolveAssemblyToPath(assemblyName);

            if (path != null)
            {
                return(LoadFromAssemblyPath(path));
            }


            // fallback to local folder first

            System.Diagnostics.Debug.WriteLine(assemblyName);

            var file = PluginInfo.PluginFolder + assemblyName.Name + ".dll";

            if (File.Exists(file))
            {
                return(LoadFromAssemblyPath(file));
            }

            // fallback to Host AssemlbyLoadContext
            a = ALCContext.HostLoadContext.LoadFromAssemblyName(assemblyName);
            if (a != null)
            {
                return(a);
            }


            // fallback to AssemblyLoadContext.Default

            return(base.Load(assemblyName));
        }
Exemplo n.º 11
0
        Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            var name = new AssemblyName(args.Name);

            return(AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(a => AssemblyName.ReferenceMatchesDefinition(name, a.GetName())));
        }
Exemplo n.º 12
0
        private IEnumerable <Assembly> GetTestsAssemblies()
        {
            var assemblies = new List <Assembly>();
            var path       = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

            var assembliesDirectoryInfo = new DirectoryInfo(path);
            var assemblyFiles           = assembliesDirectoryInfo.GetFiles("terminal*.dll",
                                                                           SearchOption.TopDirectoryOnly).Select(f => f.FullName).ToList();

            assemblyFiles.Add(Path.Combine(path, "HubTests.dll"));

            foreach (var assemblyFile in assemblyFiles)
            {
                var assemblyName = AssemblyName.GetAssemblyName(assemblyFile);

                if (!AppDomain.CurrentDomain.GetAssemblies().Any(a =>
                                                                 AssemblyName.ReferenceMatchesDefinition(assemblyName, a.GetName())))
                {
                    var assembly = Assembly.Load(assemblyName);
                    assemblies.Add(assembly);
                }
                else
                {
                    var assembly = AppDomain.CurrentDomain.GetAssemblies().First(a => AssemblyName.ReferenceMatchesDefinition(assemblyName, a.GetName()));
                    assemblies.Add(assembly);
                }

                //Add HM assembly since here are defined the tasks which are run like tests (e.g. MetricMonitor)
                assemblies.Add(Assembly.GetExecutingAssembly());
            }

            return(assemblies);
        }
 private bool IsAssemblyReferencedBy(Assembly referenced, Assembly origin)
 {
     return(origin.GetReferencedAssemblies()
            .Where(assemblyName => AssemblyName.ReferenceMatchesDefinition(assemblyName, referenced.GetName()))
            .Any());
 }
 private static AssemblyName ArgReferenceMatchesDefinition(Assembly referencedAssembly)
 {
     return(Arg <AssemblyName> .Matches(name => AssemblyName.ReferenceMatchesDefinition(name, referencedAssembly.GetName())));
 }
Exemplo n.º 15
0
        private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            AssemblyName assemblyName = new AssemblyName(args.Name);

            AssemblyInfo assemblyInfo = this.registeredAssemblies.FirstOrDefault(a => AssemblyName.ReferenceMatchesDefinition(assemblyName, a.AssemblyName));

            if (assemblyInfo != null)
            {
                if (assemblyInfo.Assembly == null)
                {
                    assemblyInfo.Assembly = Assembly.LoadFrom(assemblyInfo.AssemblyUri.LocalPath);
                }

                return(assemblyInfo.Assembly);
            }

            return(null);
        }
Exemplo n.º 16
0
        public Type Build(AssemblyBuilderHelper assemblyBuilder)
        {
            if (assemblyBuilder == null)
            {
                throw new ArgumentNullException("assemblyBuilder");
            }

            // Check InternalsVisibleToAttributes of the source type's assembly.
            // Even if the sourceType is public, it may have internal fields and props.
            //
            _friendlyAssembly = false;

            // Usually, there is no such attribute in the source assembly.
            // Therefore we do not cache the result.
            //
            object[] attributes = _originalType.Type.Assembly.GetCustomAttributes(typeof(InternalsVisibleToAttribute), true);

            foreach (InternalsVisibleToAttribute visibleToAttribute in attributes)
            {
                AssemblyName an = new AssemblyName(visibleToAttribute.AssemblyName);

                if (AssemblyName.ReferenceMatchesDefinition(assemblyBuilder.AssemblyName, an))
                {
                    _friendlyAssembly = true;
                    break;
                }
            }

            if (!_originalType.Type.IsVisible && !_friendlyAssembly)
#if FW3
            { return(typeof(ExprTypeAccessor <,>).MakeGenericType(_type, _originalType)); }
#else
            { throw new TypeBuilderException(string.Format("Can not build type accessor for non-public type '{0}'.", _originalType.FullName)); }
#endif

            string typeName = GetTypeName();

            _typeBuilder = assemblyBuilder.DefineType(typeName, _accessorType);

            _typeBuilder.DefaultConstructor.Emitter
            .ldarg_0
            .call(TypeHelper.GetDefaultConstructor(_accessorType))
            ;

            BuildCreateInstanceMethods();
            BuildTypeProperties();
            BuildMembers();
            BuildObjectFactory();

            _typeBuilder.DefaultConstructor.Emitter
            .ret()
            ;

            Type result = _typeBuilder.Create();

            foreach (TypeBuilderHelper tb in _nestedTypes)
            {
                tb.Create();
            }

            return(result);
        }
Exemplo n.º 17
0
        private IEnumerable <Assembly> LoadSpeckleReferencingAssemblies(IEnumerable <Assembly> loadedAssemblies)
        {
            var assemblies = new HashSet <Assembly>();
            var loadedSpeckleReferencingAssemblyNames = loadedAssemblies.Select(assembly => assembly.GetName()).ToArray();
            var directories = Directory.GetDirectories(SpeckleKitsDirectory);
            var currDomain  = AppDomain.CurrentDomain;


            foreach (var directory in directories)
            {
                foreach (var assemblyPath in System.IO.Directory.EnumerateFiles(directory, "*.dll"))
                {
                    var unloadedAssemblyName = SafeGetAssemblyName(assemblyPath);

                    if (unloadedAssemblyName == null)
                    {
                        continue;
                    }

                    if (!loadedSpeckleReferencingAssemblyNames.Any(loadedSpeckleReferencingAssemblyName => AssemblyName.ReferenceMatchesDefinition(loadedSpeckleReferencingAssemblyName, unloadedAssemblyName)))
                    {
                        //var relfectionLoadAssembly = Assembly.ReflectionOnlyLoadFrom( assemblyPath );
                        var relfectionLoadAssembly = Assembly.LoadFrom(assemblyPath);
                        var isReferencingCore      = relfectionLoadAssembly.IsReferencing(SpeckleAssemblyName);

                        if (isReferencingCore)
                        {
                            Debug.WriteLine("Load converter: " + unloadedAssemblyName);
                            var assembly = SafeLoadAssembly(AppDomain.CurrentDomain, unloadedAssemblyName);
                            if (assembly != null)
                            {
                                var res  = assembly.GetTypes();
                                var copy = res;

                                assemblies.Add(assembly);
                            }
                        }
                    }
                }
            }
            return(assemblies.ToArray());
        }
        // Token: 0x060008FB RID: 2299 RVA: 0x00040AF8 File Offset: 0x0003ECF8
        private static Assembly CurrentDomain_ReflectionOnlyAssemblyResolve(object sender, ResolveEventArgs args)
        {
            AssemblyName     assemblyName       = new AssemblyName(args.Name);
            Assembly         requestingAssembly = args.RequestingAssembly;
            List <Exception> list = new List <Exception>();

            try
            {
                Assembly assembly = Assembly.ReflectionOnlyLoad(args.Name);
                PluginsFactory <T> .ReportReflectionLoad(assemblyName, assembly, requestingAssembly);

                return(assembly);
            }
            catch (Exception item)
            {
                list.Add(item);
            }
            foreach (Assembly assembly2 in AppDomain.CurrentDomain.ReflectionOnlyGetAssemblies())
            {
                if (AssemblyName.ReferenceMatchesDefinition(assembly2.GetName(), assemblyName))
                {
                    PluginsFactory <T> .ReportReflectionLoad(assemblyName, assembly2, requestingAssembly);

                    return(assembly2);
                }
            }
            if (requestingAssembly != null)
            {
                try
                {
                    Uri uri = new Uri(requestingAssembly.CodeBase);
                    if (uri.IsAbsoluteUri)
                    {
                        string text = Path.Combine(Path.GetDirectoryName(uri.LocalPath) ?? string.Empty, assemblyName.Name + ".dll");
                        if (File.Exists(text))
                        {
                            AssemblyName assemblyName2 = AssemblyName.GetAssemblyName(text);
                            if (AssemblyName.ReferenceMatchesDefinition(assemblyName, assemblyName2))
                            {
                                Assembly assembly3 = Assembly.ReflectionOnlyLoadFrom(text);
                                PluginsFactory <T> .ReportReflectionLoad(assemblyName, assembly3, requestingAssembly);

                                return(assembly3);
                            }
                        }
                    }
                }
                catch (Exception item2)
                {
                    list.Add(item2);
                }
            }
            try
            {
                Assembly[] array = AppDomain.CurrentDomain.GetAssemblies();
                for (int i = 0; i < array.Length; i++)
                {
                    AssemblyName name = array[i].GetName();
                    if (AssemblyName.ReferenceMatchesDefinition(name, assemblyName))
                    {
                        Uri uri2 = new Uri(name.CodeBase);
                        if (uri2.IsAbsoluteUri)
                        {
                            Assembly assembly4 = Assembly.ReflectionOnlyLoadFrom(uri2.LocalPath);
                            PluginsFactory <T> .ReportReflectionLoad(assemblyName, assembly4, requestingAssembly);

                            return(assembly4);
                        }
                    }
                }
            }
            catch (Exception item3)
            {
                list.Add(item3);
            }
            if (!PluginsFactory <T> .log.IsErrorEnabled)
            {
                return(null);
            }
            AggregateException ex = new AggregateException(new StringBuilder("inspecting [").Append(args.Name).Append(']').Append(PluginsFactory <T> .FormatRequest(requestingAssembly)).Append('.').ToString(), list);

            PluginsFactory <T> .log.WarnFormat("{0}", ex);

            return(null);
        }
Exemplo n.º 19
0
 private static void RegisterAssembly(Assembly assembly)
 {
     AssemblyName[] refAsm = new AssemblyName[0];
     try {
         refAsm = assembly.GetReferencedAssemblies();
     } catch { }
     if (NeedProcess(assembly) && (assembly == typeof(SPModel).Assembly || refAsm.Any(v => AssemblyName.ReferenceMatchesDefinition(v, SelfAssemblyName))))
     {
         bool requireLock = !enteredLock;
         if (requireLock)
         {
             Monitor.Enter(syncLock);
             enteredLock = true;
         }
         try {
             RegisterAssemblyRecursive(assembly);
         } finally {
             if (requireLock)
             {
                 enteredLock = false;
                 Monitor.Exit(syncLock);
             }
         }
     }
 }
Exemplo n.º 20
0
        public static Assembly[] GetAssemblies(Type?entryType = null)
        {
            var checkedAssemblies        = new HashSet <Assembly>();
            var entryAssembly            = entryType?.Assembly ?? Assembly.GetEntryAssembly() !;
            var entryAssemblyFirstPrefix = entryAssembly.GetName().Name !.Split(separator: ".").First();
            var toCheck = new Queue <Assembly>(collection: new[] { entryAssembly });

            while (toCheck.Count > 0)
            {
                var assembly = toCheck.Dequeue();
                checkedAssemblies.Add(item: assembly);

                var loaded = assembly.GetReferencedAssemblies()
                             .Where(predicate: x => x.Name?.StartsWith(value: entryAssemblyFirstPrefix) ?? false)
                             .Where(predicate: x => !checkedAssemblies.Any(predicate: chx => AssemblyName.ReferenceMatchesDefinition(reference: x, definition: chx.GetName())))
                             .Where(predicate: x => !toCheck.Any(predicate: chx => AssemblyName.ReferenceMatchesDefinition(reference: x, definition: chx.GetName())))
                             .Select(selector: Assembly.Load);
                foreach (var loadedAssembly in loaded)
                {
                    toCheck.Enqueue(item: loadedAssembly);
                }
            }

            var allReferencedAssemblies = checkedAssemblies.ToArray();

            if (allReferencedAssemblies.Length == 0)
            {
                throw new InvalidOperationException(message: "Entry Assembly not loaded properly");
            }
            return(allReferencedAssemblies);
        }