@@ -52,81 +52,111 @@ internal AssemblyInfo(AssemblyName name, string filePath, bool isLoaded)
52
52
/// <remarks>Used in the logs</remarks>
53
53
public string Name { get ; }
54
54
55
+ private readonly string [ ] m_FilterDirs ;
56
+
55
57
/// <summary>
56
58
/// Default constructor
57
59
/// </summary>
58
60
/// <param name="name">Name of the resolver</param>
59
- public AssemblyNameReferenceResolver ( string name )
61
+ /// <param name="filterDirs">Only resolve the assembly if requesting assembly is in the specified directories</param>
62
+ public AssemblyNameReferenceResolver ( string name , string [ ] filterDirs = null )
60
63
{
61
64
if ( string . IsNullOrEmpty ( name ) )
62
65
{
63
66
name = this . GetType ( ) . FullName ;
64
67
}
65
68
66
69
Name = name ;
70
+
71
+ m_FilterDirs = filterDirs ;
67
72
}
68
73
69
74
/// <inheritdoc/>>
70
75
public virtual Assembly Resolve ( AppDomain appDomain , AssemblyName assmName , Assembly requestingAssembly )
71
76
{
72
- var searchAssmName = GetReplacementAssemblyName ( assmName , requestingAssembly , out string searchDir , out bool recursiveSearch ) ;
73
-
74
- if ( searchAssmName != null )
77
+ if ( ShouldResolve ( appDomain , assmName , requestingAssembly ) )
75
78
{
76
- var matchedAssmNames = new List < AssemblyInfo > ( ) ;
77
-
78
- var replacementAssms = appDomain . GetAssemblies ( ) . Where (
79
- a => Match ( a . GetName ( ) , searchAssmName ) ) ;
80
-
81
- var exactMatch = replacementAssms . FirstOrDefault ( a => CompareAssemblyNames ( a . GetName ( ) , searchAssmName ) ) ;
79
+ var searchAssmName = GetReplacementAssemblyName ( assmName , requestingAssembly , out string searchDir , out bool recursiveSearch ) ;
82
80
83
- if ( exactMatch != null )
81
+ if ( searchAssmName != null )
84
82
{
85
- Trace . WriteLine ( $ "Assembly ' { searchAssmName } ' is resolved to ' { exactMatch . Location } ' as exact match via ' { Name } ' resolver" , Name ) ;
83
+ var matchedAssmNames = new List < AssemblyInfo > ( ) ;
86
84
87
- return exactMatch ;
88
- }
89
- else
90
- {
91
- matchedAssmNames . AddRange ( replacementAssms . Select ( a => new AssemblyInfo ( a . GetName ( ) , a . Location , true ) ) ) ;
92
- }
85
+ var replacementAssms = appDomain . GetAssemblies ( ) . Where (
86
+ a => Match ( a . GetName ( ) , searchAssmName ) ) ;
93
87
94
- foreach ( var name in EnumerateAssemblyByName ( searchDir , recursiveSearch , searchAssmName ) )
95
- {
96
- if ( CompareAssemblyNames ( name . Name , searchAssmName ) )
88
+ var exactMatch = replacementAssms . FirstOrDefault ( a => CompareAssemblyNames ( a . GetName ( ) , searchAssmName ) ) ;
89
+
90
+ if ( exactMatch != null )
97
91
{
98
- Trace . WriteLine ( $ "Loading '{ searchAssmName } ' from ' { name . FilePath } ' as exact match via '{ Name } ' resolver", Name ) ;
92
+ Trace . WriteLine ( $ "Assembly '{ searchAssmName } ' is resolved to ' { exactMatch . Location } ' as exact match via '{ Name } ' resolver", Name ) ;
99
93
100
- return Assembly . LoadFrom ( name . FilePath ) ;
94
+ return exactMatch ;
101
95
}
102
- else
96
+ else
103
97
{
104
- matchedAssmNames . Add ( name ) ;
98
+ matchedAssmNames . AddRange ( replacementAssms . Select ( a => new AssemblyInfo ( a . GetName ( ) , a . Location , true ) ) ) ;
105
99
}
106
- }
107
100
108
- var assmInfo = ResolveAmbiguity ( matchedAssmNames , searchAssmName ) ;
109
-
110
- if ( assmInfo != null )
111
- {
112
- if ( assmInfo . IsLoaded )
101
+ foreach ( var name in EnumerateAssemblyByName ( searchDir , recursiveSearch , searchAssmName ) )
113
102
{
114
- Trace . WriteLine ( $ "Loading '{ assmInfo . Name } ' from assembly name via '{ Name } ' resolver", Name ) ;
115
-
116
- return Assembly . Load ( assmInfo . Name ) ;
103
+ if ( CompareAssemblyNames ( name . Name , searchAssmName ) )
104
+ {
105
+ Trace . WriteLine ( $ "Loading '{ searchAssmName } ' from '{ name . FilePath } ' as exact match via '{ Name } ' resolver", Name ) ;
106
+
107
+ return LoadAssembly ( new AssemblyInfo ( AssemblyName . GetAssemblyName ( name . FilePath ) , name . FilePath , false ) ) ;
108
+ }
109
+ else
110
+ {
111
+ matchedAssmNames . Add ( name ) ;
112
+ }
117
113
}
118
- else
119
- {
120
- Trace . WriteLine ( $ "Loading '{ assmInfo . Name } ' from file '{ assmInfo . FilePath } ' via '{ Name } ' resolver", Name ) ;
121
114
122
- return Assembly . LoadFrom ( assmInfo . FilePath ) ;
115
+ var assmInfo = ResolveAmbiguity ( matchedAssmNames , searchAssmName ) ;
116
+
117
+ if ( assmInfo != null )
118
+ {
119
+ return LoadAssembly ( assmInfo ) ;
123
120
}
124
121
}
125
122
}
126
123
127
124
return null ;
128
125
}
129
126
127
+ /// <summary>
128
+ /// Checks if assembly should be resolved by this resolver
129
+ /// </summary>
130
+ /// <param name="appDomain">App Domain</param>
131
+ /// <param name="assmName">Assembly to resolve</param>
132
+ /// <param name="requestingAssembly">Requesting assembly</param>
133
+ /// <returns></returns>
134
+ protected virtual bool ShouldResolve ( AppDomain appDomain , AssemblyName assmName , Assembly requestingAssembly )
135
+ {
136
+ if ( m_FilterDirs ? . Any ( ) == true && requestingAssembly != null )
137
+ {
138
+ var reqAssmFilePath = requestingAssembly . Location ;
139
+
140
+ return m_FilterDirs . Any ( f => FileSystemUtils . IsInDirectory ( reqAssmFilePath , f ) ) ;
141
+ }
142
+ else
143
+ {
144
+ return true ;
145
+ }
146
+ }
147
+
148
+ /// <summary>
149
+ /// Load the assembly
150
+ /// </summary>
151
+ /// <param name="assmInfo">Assembly information</param>
152
+ /// <returns>Loaded assembly</returns>
153
+ protected Assembly LoadAssembly ( AssemblyInfo assmInfo )
154
+ {
155
+ Trace . WriteLine ( $ "Loading '{ assmInfo . Name } ' from file '{ assmInfo . FilePath } ' [Loaded={ assmInfo . IsLoaded } ] via '{ Name } ' resolver", Name ) ;
156
+
157
+ return Assembly . Load ( assmInfo . Name ) ;
158
+ }
159
+
130
160
/// <summary>
131
161
/// Gets the culture of the assembly name
132
162
/// </summary>
0 commit comments