-
Notifications
You must be signed in to change notification settings - Fork 0
/
AssemblyDependencyNode.cs
158 lines (131 loc) · 6.09 KB
/
AssemblyDependencyNode.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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
using System;
using System.IO;
using System.Reflection;
using Serilog;
namespace BindingRedirectR
{
internal class AssemblyDependencyNode
{
private static readonly ILogger Logger = Log.ForContext<Program>();
public AssemblyVersionedIdentity Identity { get; private set; }
public AssemblyMetadata Assembly { get; private set; }
public AssemblyName Name { get; private set; }
public AssemblyLoadStatus LoadedFromName { get; private set; }
public Exception LoadedFromNameError { get; private set; }
public FileInfo File { get; private set; }
public AssemblyLoadStatus LoadedFromFile { get; private set; }
public Exception LoadedFromFileError { get; private set; }
public bool Loaded { get; private set; }
public static AssemblyDependencyNode CreateFromName(AssemblyName assemblyName)
{
if (assemblyName == null) throw new ArgumentNullException(nameof(assemblyName));
Logger.Debug("Creating node from name {AssemblyName}.", assemblyName);
return new AssemblyDependencyNode
{
Name = assemblyName,
Identity = new AssemblyVersionedIdentity(assemblyName),
};
}
public static AssemblyDependencyNode CreateFromFile(FileInfo file)
{
if (file == null) throw new ArgumentNullException(nameof(file));
Logger.Debug("Creating node from file {File}.", file.FullName);
return new AssemblyDependencyNode
{
File = file,
// we don't have identity until we attempt to load
};
}
public void MarkAsLoadedFromFile(AssemblyMetadata assembly)
{
switch (LoadedFromFile)
{
case AssemblyLoadStatus.Loaded:
throw new InvalidOperationException("Cannot mark assembly as loaded from file, it's already loaded.");
case AssemblyLoadStatus.Failed:
throw new InvalidOperationException("Cannot mark assembly as loaded from file, previous attempt failed.");
}
switch (LoadedFromName)
{
case AssemblyLoadStatus.Loaded:
throw new InvalidOperationException("Cannot mark assembly as loaded from file, it's already loaded from name.");
}
if (Loaded)
throw new InvalidOperationException("Cannot mark assembly as loaded from file, it's already been loaded.");
LoadedFromFile = AssemblyLoadStatus.Loaded;
Assembly = assembly;
Name = new AssemblyName(assembly.AssemblyName);
Identity = new AssemblyVersionedIdentity(Name);
Loaded = true;
}
public void MarkAsFailedFromFile(Exception exception)
{
switch (LoadedFromFile)
{
case AssemblyLoadStatus.Loaded:
throw new InvalidOperationException("Cannot mark assembly as failed from file, it's already loaded.");
case AssemblyLoadStatus.Failed:
throw new InvalidOperationException("Cannot mark assembly as failed from file, previous attempt failed.");
}
switch (LoadedFromName)
{
case AssemblyLoadStatus.Loaded:
throw new InvalidOperationException("Cannot mark assembly as failed from file, it's already loaded from name.");
}
if (Loaded)
throw new InvalidOperationException("Cannot mark assembly as failed from file, it's already been loaded.");
LoadedFromFile = AssemblyLoadStatus.Failed;
LoadedFromFileError = exception;
}
public void MarkAsLoadedFromName(AssemblyMetadata assembly)
{
switch (LoadedFromName)
{
case AssemblyLoadStatus.Loaded:
throw new InvalidOperationException("Cannot mark assembly as loaded from name, it's already loaded.");
case AssemblyLoadStatus.Failed:
throw new InvalidOperationException("Cannot mark assembly as loaded from name, previous attempt failed.");
}
switch (LoadedFromFile)
{
case AssemblyLoadStatus.Loaded:
throw new InvalidOperationException("Cannot mark assembly as loaded from name, it's already loaded from file.");
}
if (Loaded)
throw new InvalidOperationException("Cannot mark assembly as loaded from name, it's already been loaded.");
LoadedFromName = AssemblyLoadStatus.Loaded;
Assembly = assembly;
File = new FileInfo(assembly.Location);
Loaded = true;
}
public void MarkAsFailedFromName(Exception exception)
{
switch (LoadedFromName)
{
case AssemblyLoadStatus.Loaded:
throw new InvalidOperationException("Cannot mark assembly as failed from name, it's already loaded.");
case AssemblyLoadStatus.Failed:
throw new InvalidOperationException("Cannot mark assembly as failed from name, previous attempt failed.");
}
switch (LoadedFromFile)
{
case AssemblyLoadStatus.Loaded:
throw new InvalidOperationException("Cannot mark assembly as failed from name, it's already loaded from file.");
}
if (Loaded)
throw new InvalidOperationException("Cannot mark assembly as failed from name, it's already been loaded.");
LoadedFromName = AssemblyLoadStatus.Failed;
LoadedFromNameError = exception;
}
public override string ToString()
{
if (Loaded)
return Identity.ToString();
if (File != null)
return $"[not loaded] {File.FullName}";
if (Name != null)
return $"[not loaded] {Name.FullName}";
return "[not loaded] (unknown)"; // shouldn't happen
}
}
}