forked from topnguyen/Elect
-
Notifications
You must be signed in to change notification settings - Fork 1
/
AssemblyLoader.cs
83 lines (68 loc) · 2.62 KB
/
AssemblyLoader.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#region License
//--------------------------------------------------
// <License>
// <Copyright> 2018 © Top Nguyen </Copyright>
// <Url> http://topnguyen.com/ </Url>
// <Author> Top </Author>
// <Project> Elect </Project>
// <File>
// <Name> AssemblyLoader.cs </Name>
// <Created> 16/03/2018 11:09:48 AM </Created>
// <Key> 88b43622-7525-4ea3-b79a-7f580f3f4b46 </Key>
// </File>
// <Summary>
// AssemblyLoader.cs is a part of Elect
// </Summary>
// <License>
//--------------------------------------------------
#endregion License
using Microsoft.DotNet.PlatformAbstractions;
using Microsoft.Extensions.DependencyModel;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.Loader;
namespace Elect.Core.AssemblyUtils
{
internal class AssemblyLoader : AssemblyLoadContext
{
internal List<AssemblyName> ListLoadedAssemblyName { get; } = new List<AssemblyName>();
internal readonly string AssemblyDirectoryPath;
internal AssemblyLoader(string assemblyDirectoryPath)
{
AssemblyDirectoryPath = assemblyDirectoryPath;
// Update List Loaded Assembly
var runtimeId = RuntimeEnvironment.GetRuntimeIdentifier();
var listLoadedAssemblyName = DependencyContext.Default.GetRuntimeAssemblyNames(runtimeId).ToList();
foreach (var assemblyName in listLoadedAssemblyName)
{
if (!ListLoadedAssemblyName.Contains(assemblyName))
{
ListLoadedAssemblyName.Add(assemblyName);
}
}
}
/// <inheritdoc />
/// <summary>
/// Load an assembly, if the assembly already loaded then return
/// </summary>
/// <param name="assemblyName"></param>
/// <returns></returns>
protected override Assembly Load(AssemblyName assemblyName)
{
// Check if assembly already added by Dependency (Reference)
if (ListLoadedAssemblyName.Any(x => string.Equals(x.Name, assemblyName.Name, StringComparison.OrdinalIgnoreCase)))
{
return null;
}
// Load Assembly not yet load
var assemblyFilePath = Path.Combine(AssemblyDirectoryPath, assemblyName.Name) + ".dll";
var assembly = File.Exists(assemblyFilePath) ? LoadFromAssemblyPath(assemblyFilePath) : Assembly.Load(assemblyName);
// Add to loaded
ListLoadedAssemblyName.Add(assemblyName);
return assembly;
}
}
}