-
Notifications
You must be signed in to change notification settings - Fork 75
Expand file tree
/
Copy pathDotNetCoreAssemblyResolver.cs
More file actions
101 lines (86 loc) · 2.9 KB
/
DotNetCoreAssemblyResolver.cs
File metadata and controls
101 lines (86 loc) · 2.9 KB
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using ArchUnitNET.Domain.Extensions;
using JetBrains.Annotations;
using Mono.Cecil;
namespace ArchUnitNET.Loader
{
internal class DotNetCoreAssemblyResolver : IAssemblyResolver
{
private readonly DefaultAssemblyResolver _defaultAssemblyResolver;
private readonly Dictionary<string, AssemblyDefinition> _libraries;
public string AssemblyPath { get; set; } = "";
public DotNetCoreAssemblyResolver()
{
_libraries = new Dictionary<string, AssemblyDefinition>();
_defaultAssemblyResolver = new DefaultAssemblyResolver();
}
[CanBeNull]
public AssemblyDefinition Resolve(AssemblyNameReference name)
{
return Resolve(name, new ReaderParameters { AssemblyResolver = this });
}
[CanBeNull]
public AssemblyDefinition Resolve(AssemblyNameReference name, ReaderParameters parameters)
{
if (name == null)
{
throw new ArgumentNullException(nameof(name));
}
if (
_libraries.TryGetValue(name.FullName, out var assemblyDefinition)
|| string.IsNullOrEmpty(AssemblyPath)
)
{
return assemblyDefinition;
}
var file = Directory
.EnumerateFiles(AssemblyPath, $"{name.Name}.dll", SearchOption.AllDirectories)
.FirstOrDefault();
if (file == null)
{
return null;
}
assemblyDefinition = AssemblyDefinition.ReadAssembly(file, parameters);
_libraries.Add(name.FullName, assemblyDefinition);
return assemblyDefinition;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
public void AddLib([NotNull] AssemblyDefinition moduleAssembly)
{
if (!_libraries.ContainsKey(moduleAssembly.FullName))
{
_libraries.Add(moduleAssembly.FullName, moduleAssembly);
}
}
private void AddLib(
[NotNull] AssemblyNameReference name,
[NotNull] AssemblyDefinition moduleAssembly
)
{
if (!_libraries.ContainsKey(name.FullName))
{
_libraries.Add(name.FullName, moduleAssembly);
}
}
public void AddLib(AssemblyNameReference name)
{
var assembly = Resolve(name) ?? _defaultAssemblyResolver.Resolve(name);
AddLib(name, assembly ?? throw new AssemblyResolutionException(name));
}
private void Dispose(bool disposing)
{
if (!disposing)
{
return;
}
_libraries.Values.ForEach(def => def.Dispose());
}
}
}