@@ -10,8 +10,8 @@ public class OxideResolver : MetadataReferenceResolver
1010 private readonly ILogger _logger ;
1111 private readonly AppConfiguration _appConfiguration ;
1212 private readonly string _runtimePath ;
13-
1413 private readonly HashSet < PortableExecutableReference > _referenceCache ;
14+ public override bool ResolveMissingAssemblies => true ;
1515
1616 public OxideResolver ( ILogger < OxideResolver > logger , AppConfiguration appConfiguration )
1717 {
@@ -23,22 +23,21 @@ public OxideResolver(ILogger<OxideResolver> logger, AppConfiguration appConfigur
2323
2424 public override bool Equals ( object ? other ) => other ? . Equals ( this ) ?? false ;
2525
26- public override int GetHashCode ( ) => _logger . GetHashCode ( ) ;
26+ public override int GetHashCode ( ) => GetType ( ) . GetHashCode ( ) ;
2727
2828 public override ImmutableArray < PortableExecutableReference > ResolveReference ( string reference , string ? baseFilePath ,
2929 MetadataReferenceProperties properties )
3030 {
31- _logger . LogInformation ( "Resolve : {Reference} {BaseFilePath}" , reference , baseFilePath ) ;
31+ _logger . LogInformation ( "Resolving : {Reference} {BaseFilePath}" , reference , baseFilePath ) ;
3232 return ImmutableArray < PortableExecutableReference > . Empty ;
3333 }
3434
35- public override bool ResolveMissingAssemblies => true ;
35+ public override PortableExecutableReference ? ResolveMissingAssembly ( MetadataReference metadataReference , AssemblyIdentity assemblyIdentity ) =>
36+ Resolve ( metadataReference , assemblyIdentity ) ;
3637
37- public override PortableExecutableReference ? ResolveMissingAssembly ( MetadataReference definition , AssemblyIdentity referenceIdentity ) =>
38- Reference ( definition . Display ! ) ;
39-
40- public PortableExecutableReference ? Reference ( string ? name )
38+ public PortableExecutableReference ? Resolve ( MetadataReference metadataReference , AssemblyIdentity assemblyIdentity )
4139 {
40+ string ? name = metadataReference . Display ;
4241 if ( string . IsNullOrWhiteSpace ( name ) )
4342 {
4443 return null ;
@@ -52,25 +51,72 @@ public override ImmutableArray<PortableExecutableReference> ResolveReference(str
5251 return reference ;
5352 }
5453
55- if ( name . Equals ( "System.Private.CoreLib" ) )
54+ if ( name . Equals ( "System.Private.CoreLib.dll " ) )
5655 {
5756 name = "mscorlib.dll" ;
5857 }
5958
60- FileInfo fileSystem = new ( Path . Combine ( _appConfiguration . GetDirectoryConfiguration ( ) . Libraries , name ) ) ;
59+ string path = Path . Combine ( _appConfiguration . GetDirectoryConfiguration ( ) . Libraries , name ) ;
60+ FileInfo fileInfo = new ( path ) ;
61+
62+ _logger . LogDebug ( "Attempting to resolve {0} [{1}] from {2}" , name , assemblyIdentity . Version , fileInfo . FullName ) ;
63+
64+ if ( fileInfo . Exists )
65+ {
66+ reference = MetadataReference . CreateFromFile ( fileInfo . FullName ) ;
67+ _referenceCache . Add ( reference ) ;
68+ return reference ;
69+ }
70+
71+ fileInfo = new FileInfo ( Path . Combine ( _runtimePath , name ) ) ;
6172
62- if ( fileSystem . Exists )
73+ if ( fileInfo . Exists )
6374 {
64- reference = MetadataReference . CreateFromFile ( fileSystem . FullName ) ;
75+ reference = MetadataReference . CreateFromFile ( fileInfo . FullName ) ;
6576 _referenceCache . Add ( reference ) ;
6677 return reference ;
6778 }
6879
69- fileSystem = new FileInfo ( Path . Combine ( _runtimePath , name ) ) ;
80+ _logger . LogError ( "Unable to find required dependency {0}" , name ) ;
81+ return null ;
82+ }
83+
84+ public PortableExecutableReference ? AddReference ( string ? name )
85+ {
86+ if ( string . IsNullOrWhiteSpace ( name ) )
87+ {
88+ return null ;
89+ }
90+
91+ PortableExecutableReference ? reference = _referenceCache . FirstOrDefault ( r =>
92+ Path . GetFileName ( r . Display ) == name ) ;
93+
94+ if ( reference != null )
95+ {
96+ return reference ;
97+ }
98+
99+ if ( name . Equals ( "System.Private.CoreLib.dll" ) )
100+ {
101+ name = "mscorlib.dll" ;
102+ }
103+
104+ string path = Path . Combine ( _appConfiguration . GetDirectoryConfiguration ( ) . Libraries , name ) ;
105+ FileInfo fileInfo = new ( path ) ;
106+
107+ _logger . LogDebug ( "Adding reference {0} from {1}" , name , fileInfo . FullName ) ;
108+
109+ if ( fileInfo . Exists )
110+ {
111+ reference = MetadataReference . CreateFromFile ( fileInfo . FullName ) ;
112+ _referenceCache . Add ( reference ) ;
113+ return reference ;
114+ }
70115
71- if ( fileSystem . Exists )
116+ fileInfo = new FileInfo ( Path . Combine ( _runtimePath , name ) ) ;
117+ if ( fileInfo . Exists )
72118 {
73- reference = MetadataReference . CreateFromFile ( fileSystem . FullName ) ;
119+ reference = MetadataReference . CreateFromFile ( fileInfo . FullName ) ;
74120 _referenceCache . Add ( reference ) ;
75121 return reference ;
76122 }
0 commit comments