Пример #1
0
        public IAssembly TryLoad(string dll, string pdb, string version = null)
        {
            if (string.IsNullOrWhiteSpace(dll))
            {
                throw new ArgumentException(nameof(dll));
            }
            if (string.IsNullOrWhiteSpace(pdb))
            {
                throw new ArgumentException(nameof(pdb));
            }

            // Find version if it wasn't provided
            if (string.IsNullOrWhiteSpace(version))
            {
                var assemblyName = _AssemblyNameReader.GetAssemblyName(dll);
                if (assemblyName != null)
                {
                    version = assemblyName.Version.ToString();
                }
            }

            // Used cached assembly if it is already loaded and cached
            IAssembly assembly = _AssemblyCache.FindAlreadyLoadedAssembly(dll, version);

            if (assembly != null)
            {
                return(assembly);
            }

            // Load the assembly
            assembly = _AppDomain.TryLoad(dll, pdb);
            if (assembly == null)
            {
                return(null);
            }

            var assemblyVersion = assembly.GetName()?.Version?.ToString();

            // Cache the loaded assembly (even if it is the wrong version)
            // Also, for threadsafety, get the cached assembly back, in case two threads loaded at the same time
            assembly = _AssemblyCache.Add(dll, assemblyVersion, assembly);

            // Make sure the version matches the requested version
            if (assemblyVersion != version)
            {
                return(null);
            }

            // If configured to do so, load all dependent assemblies immediately,
            if (_Settings.LoadDependenciesProactively)
            {
                var dir = Path.GetDirectoryName(dll);
                if (!dir.EndsWith("bin"))
                {
                    ProactivelyLoadDependencies(Path.Combine(dir, "bin"));
                }
            }

            return(assembly);
        }
Пример #2
0
        /// <summary>
        ///     Gets all referenced assemblies.
        /// </summary>
        /// <param name="assembly">The assembly.</param>
        /// <param name="pattern">The pattern.</param>
        /// <param name="excludePattern">The exclude pattern.</param>
        /// <param name="marked">The marked.</param>
        /// <param name="assemblies">The assemblies.</param>
        /// <returns></returns>
        // ReSharper disable once ExcessiveIndentation
        private static IAssembly[] GetAllReferencedAssemblies(IAssembly assembly, string pattern, string excludePattern,
                                                              HashSet <string> marked, Dictionary <string, IAssembly> assemblies)
        {
            var name = assembly.GetName().Name;

            marked.Add(name);
            if (!assembly.IsFrameworkAssembly())
            {
                if (CheckPattern(assembly, pattern, excludePattern))
                {
                    if (!assemblies.ContainsKey(name))
                    {
                        assemblies.Add(name, assembly);
                    }
                }
                foreach (var assemblyName in assembly.GetReferencedAssemblies())
                {
                    if (assemblyName.FullName.Contains(pattern))
                    {
                        if (!assemblyName.FullName.Contains("Unit"))
                        {
                            if (!marked.Contains(assemblyName.Name))
                            {
                                var referenced = Assembly.Load(assemblyName).Adapt();
                                GetAllReferencedAssemblies(referenced, pattern, excludePattern, marked, assemblies);
                            }
                        }
                    }
                }
            }
            return(assemblies.Values.ToArray());
        }
Пример #3
0
        /// <summary>
        ///   Gets the public key token of an assembly.
        /// </summary>
        /// <param name="assembly">The assembly.</param>
        /// <returns></returns>
        /// <remarks>Borrowed heavily from http://dhvik.blogspot.com/2009/05/assemblynamegetpublickeytoken-tostring.html </remarks>
        public static string get_public_key_token(this IAssembly assembly)
        {
            if (assembly == null)
            {
                return(string.Empty);
            }

            return(assembly.GetName().get_public_key_token());
        }
Пример #4
0
        public void GetAssemblyVersion_test()
        {
            IAssembly       assemblyStub       = Substitute.For <IAssembly>();
            IAssemblySystem assemblySystemStub = Substitute.For <IAssemblySystem>();
            IAssemblyName   assemblyNameStub   = Substitute.For <IAssemblyName>();

            assemblySystemStub.GetExecutingAssembly().Returns(assemblyStub);
            assemblyStub.GetName().Returns(assemblyNameStub);
            assemblyNameStub.Version = new Version(1, 2, 3, 4);

            Assert.AreEqual("1.2.3.4", new AssemblySample(assemblyStub, assemblySystemStub).GetAssemblyVersion());
        }
Пример #5
0
        /// <summary>
        ///   Gets the public key token of an assembly.
        /// </summary>
        /// <param name="assembly">The assembly.</param>
        /// <returns></returns>
        /// <remarks>Borrowed heavily from http://dhvik.blogspot.com/2009/05/assemblynamegetpublickeytoken-tostring.html </remarks>
        public static string get_public_key_token(this IAssembly assembly)
        {
            if (assembly == null)
            {
                return(string.Empty);
            }

            byte[] publicKeyToken = assembly.GetName().GetPublicKeyToken();

            if (publicKeyToken == null || publicKeyToken.Length == 0)
            {
                return(string.Empty);
            }

            return(publicKeyToken.Select(x => x.ToString("x2")).Aggregate((x, y) => x + y));
        }
Пример #6
0
        public List <Dependency> AnalyseAssembly(IAssembly currentAssembly, string outputPath)
        {
            var assemblyName = currentAssembly.GetName();

            if (!IsAlreadyAnalysed(assemblyName))
            {
                foreach (AssemblyName referencedName in currentAssembly.GetReferencedAssemblies())
                {
                    var assemblyInLib = _assemblyLoader.LoadAssembly(Path.Combine(outputPath, referencedName.Name + ".dll"));
                    if (assemblyInLib != null)
                    {
                        AssemblyName assemblyInLibName = assemblyInLib.GetName();
                        AddToDependencyList(assemblyName, referencedName, assemblyInLibName);
                        AnalyseAssembly(assemblyInLib, outputPath);
                    }
                }
            }
            return(_dependencies);
        }
Пример #7
0
        public IAssembly Add(string dll, string assemblyVersion, IAssembly assembly)
        {
            if (string.IsNullOrWhiteSpace(dll))
            {
                throw new ArgumentException(nameof(dll));
            }
            if (assembly == null)
            {
                throw new ArgumentNullException(nameof(assembly));
            }
            if (string.IsNullOrWhiteSpace(assemblyVersion))
            {
                assemblyVersion = assembly.GetName().Version?.ToString();
            }

            var key = GetKey(dll, assemblyVersion);

            Assemblies.TryAdd(key, assembly);          // Since it is a ConcurrentDictionary another assembly could already be added by another thread.
            Assemblies.TryGetValue(key, out assembly); // Get the loaded assembly in case a different thread loaded one.
            return(assembly);
        }
Пример #8
0
 public string GetAssemblyVersion()
 {
     _assembly = _assemblySystem.GetExecutingAssembly();
     return _assembly.GetName().Version.ToString();
 }
Пример #9
0
 private void FindReferencesOf(IAssembly assembly)
 {
     foreach (AssemblyName referenceName in assembly.GetReferencedAssemblies()) {
         Analyse(assembly.GetName(), referenceName);
     }
 }
Пример #10
0
 public string GetAssemblyVersion()
 {
     _assembly = _assemblySystem.GetExecutingAssembly();
     return(_assembly.GetName().Version.ToString());
 }