< Summary

Information
Class: Ice.Internal.AssemblyUtil
Assembly: Ice
File(s): /_/csharp/src/Ice/Internal/AssemblyUtil.cs
Tag: 125_37167941578
Line coverage
83%
Covered lines: 31
Uncovered lines: 6
Coverable lines: 37
Total lines: 100
Line coverage: 83.7%
Branch coverage
100%
Covered branches: 14
Total branches: 14
Branch coverage: 100%
Method coverage
100%
Covered methods: 5
Fully covered methods: 2
Total methods: 5
Method coverage: 100%
Full method coverage: 40%

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()100%11100%
createInstance(...)100%1150%
preloadAssemblies()100%11100%
loadAssemblies()100%1010100%
loadReferencedAssemblies(...)100%4471.43%

File(s)

/_/csharp/src/Ice/Internal/AssemblyUtil.cs

#LineLine coverage
 1// Copyright (c) ZeroC, Inc.
 2
 3using System.Collections;
 4using System.Reflection;
 5using System.Runtime.InteropServices;
 6
 7namespace Ice.Internal;
 8
 9public static class AssemblyUtil
 10{
 111    public static readonly bool isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
 112    public static readonly bool isMacOS = RuntimeInformation.IsOSPlatform(OSPlatform.OSX);
 13
 14    public static object createInstance(Type t)
 15    {
 16        try
 17        {
 118            return System.Activator.CreateInstance(t);
 19        }
 020        catch (MemberAccessException)
 21        {
 022            return null;
 23        }
 124    }
 25
 26    public static void preloadAssemblies()
 27    {
 128        lock (_mutex)
 29        {
 130            loadAssemblies(); // Lazy initialization
 131        }
 132    }
 33
 34    //
 35    // Make sure that all assemblies that are referenced by this process
 36    // are actually loaded. This is necessary so we can use reflection
 37    // on any type in any assembly because the type we are after will
 38    // most likely not be in the current assembly and, worse, may be
 39    // in an assembly that has not been loaded yet. (Type.GetType()
 40    // is no good because it looks only in the calling object's assembly
 41    // and mscorlib.dll.)
 42    //
 43    private static void loadAssemblies()
 44    {
 145        Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
 146        List<Assembly> newAssemblies = null;
 147        foreach (Assembly a in assemblies)
 48        {
 149            if (!_loadedAssemblies.Contains(a.FullName))
 50            {
 151                newAssemblies ??= new List<Assembly>();
 152                newAssemblies.Add(a);
 153                _loadedAssemblies[a.FullName] = a;
 54            }
 55        }
 156        if (newAssemblies != null)
 57        {
 158            foreach (Assembly a in newAssemblies)
 59            {
 160                loadReferencedAssemblies(a);
 61            }
 62        }
 163    }
 64
 65    private static void loadReferencedAssemblies(Assembly a)
 66    {
 67        try
 68        {
 169            AssemblyName[] names = a.GetReferencedAssemblies();
 170            foreach (AssemblyName name in names)
 71            {
 172                if (!_loadedAssemblies.ContainsKey(name.FullName))
 73                {
 74                    try
 75                    {
 176                        var ra = Assembly.Load(name);
 77                        //
 78                        // The value of name.FullName may not match that of ra.FullName, so
 79                        // we record the assembly using both keys.
 80                        //
 181                        _loadedAssemblies[name.FullName] = ra;
 182                        _loadedAssemblies[ra.FullName] = ra;
 183                        loadReferencedAssemblies(ra);
 184                    }
 085                    catch (System.Exception)
 86                    {
 87                        // Ignore assemblies that cannot be loaded.
 088                    }
 89                }
 90            }
 191        }
 092        catch (PlatformNotSupportedException)
 93        {
 94            // Some platforms like UWP do not support using GetReferencedAssemblies
 095        }
 196    }
 97
 198    private static readonly Hashtable _loadedAssemblies = []; // <string, Assembly> pairs.
 199    private static readonly object _mutex = new();
 100}