-
Notifications
You must be signed in to change notification settings - Fork 36
Expand file tree
/
Copy pathMicrosoftDependencyModelAssemblyResolver.cs
More file actions
72 lines (62 loc) · 2.32 KB
/
MicrosoftDependencyModelAssemblyResolver.cs
File metadata and controls
72 lines (62 loc) · 2.32 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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Microsoft.Extensions.DependencyModel;
using Microsoft.Extensions.DependencyModel.Resolution;
namespace VSharp.CSharpUtils.AssemblyResolving
{
public class MicrosoftDependencyModelAssemblyResolver : IAssemblyResolver
{
private readonly List<ICompilationAssemblyResolver> _resolvers = new();
private readonly DependencyContext _context;
public MicrosoftDependencyModelAssemblyResolver(DependencyContext context, params ICompilationAssemblyResolver[] resolvers)
{
_resolvers.AddRange(resolvers);
_context = context;
}
public string Resolve(AssemblyName assemblyName)
{
if (_context is null)
{
return null;
}
var compilationLibrary = _context.CompileLibraries.FirstOrDefault(l =>
l.Name.Equals(assemblyName.Name, StringComparison.OrdinalIgnoreCase));
if (compilationLibrary is null)
{
var runtimeLibrary = _context.RuntimeLibraries.FirstOrDefault(l =>
l.Name.Equals(assemblyName.Name, StringComparison.OrdinalIgnoreCase));
if (runtimeLibrary is not null)
{
compilationLibrary = new CompilationLibrary(
runtimeLibrary.Type,
runtimeLibrary.Name,
runtimeLibrary.Version,
runtimeLibrary.Hash,
runtimeLibrary.RuntimeAssemblyGroups.SelectMany(g => g.AssetPaths),
runtimeLibrary.Dependencies,
runtimeLibrary.Serviceable
);
}
}
if (compilationLibrary is null)
{
return null;
}
var assemblies = new List<string>();
foreach (ICompilationAssemblyResolver resolver in _resolvers)
{
try
{
if (resolver.TryResolveAssemblyPaths(compilationLibrary, assemblies))
{
return assemblies[0];
}
}
catch { }
}
return null;
}
}
}