@@ -95,6 +95,8 @@ public void AddReferenceSearchPaths(params string[] paths)
95
95
/// <inheritdoc />
96
96
public IReadOnlyList < IAssemblySymbol ? > LoadAssemblies ( params string [ ] paths )
97
97
{
98
+ _log . LogMessage ( MessageImportance . Low , string . Format ( Resources . LoadingAssemblies , string . Join ( ", " , paths ) ) ) ;
99
+
98
100
// First resolve all assemblies that are passed in and create metadata references out of them.
99
101
// Reference assemblies of the passed in assemblies that themselves are passed in, will be skipped to be resolved,
100
102
// as they are resolved as part of the loop below.
@@ -119,6 +121,8 @@ public void AddReferenceSearchPaths(params string[] paths)
119
121
/// <inheritdoc />
120
122
public IReadOnlyList < IAssemblySymbol ? > LoadAssembliesFromArchive ( string archivePath , IReadOnlyList < string > relativePaths )
121
123
{
124
+ _log . LogMessage ( MessageImportance . Low , string . Format ( Resources . LoadingAssembliesFromArchive , string . Join ( ", " , relativePaths ) , archivePath ) ) ;
125
+
122
126
using FileStream stream = File . OpenRead ( archivePath ) ;
123
127
using ZipArchive zipFile = new ( stream ) ;
124
128
@@ -144,7 +148,8 @@ public void AddReferenceSearchPaths(params string[] paths)
144
148
string name = Path . GetFileName ( relativePaths [ i ] ) ;
145
149
if ( ! _loadedAssemblies . TryGetValue ( name , out MetadataReference ? metadataReference ) )
146
150
{
147
- metadataReference = CreateAndAddReferenceToCompilation ( name , memoryStream , fileNames ) ;
151
+ string rootAssemblyDisplayString = string . Format ( Resources . RootAssemblyFromPackageDisplayString , relativePaths [ i ] , archivePath ) ;
152
+ metadataReference = CreateAndAddReferenceToCompilation ( name , rootAssemblyDisplayString , memoryStream , fileNames ) ;
148
153
}
149
154
150
155
metadataReferences [ i ] = metadataReference ;
@@ -170,6 +175,8 @@ public void AddReferenceSearchPaths(params string[] paths)
170
175
/// <inheritdoc />
171
176
public IAssemblySymbol ? LoadAssembly ( string path )
172
177
{
178
+ _log . LogMessage ( MessageImportance . Low , string . Format ( Resources . LoadingAssembly , path ) ) ;
179
+
173
180
MetadataReference metadataReference = CreateOrGetMetadataReferenceFromPath ( path ) ;
174
181
IAssemblySymbol ? assemblySymbol = _cSharpCompilation . GetAssemblyOrModuleSymbol ( metadataReference ) as IAssemblySymbol ;
175
182
LogCompilationDiagnostics ( ) ;
@@ -180,14 +187,17 @@ public void AddReferenceSearchPaths(params string[] paths)
180
187
/// <inheritdoc />
181
188
public IAssemblySymbol ? LoadAssembly ( string name , Stream stream )
182
189
{
190
+ _log . LogMessage ( MessageImportance . Low , string . Format ( Resources . LoadingAssemblyFromStream , name ) ) ;
191
+
183
192
if ( stream . Position >= stream . Length )
184
193
{
185
194
throw new ArgumentException ( Resources . StreamPositionGreaterThanLength , nameof ( stream ) ) ;
186
195
}
187
196
188
197
if ( ! _loadedAssemblies . TryGetValue ( name , out MetadataReference ? metadataReference ) )
189
198
{
190
- metadataReference = CreateAndAddReferenceToCompilation ( name , stream ) ;
199
+ string rootAssemblyDisplayString = string . Format ( Resources . RootAssemblyDisplayString , name ) ;
200
+ metadataReference = CreateAndAddReferenceToCompilation ( name , rootAssemblyDisplayString , stream ) ;
191
201
}
192
202
193
203
IAssemblySymbol ? assemblySymbol = _cSharpCompilation . GetAssemblyOrModuleSymbol ( metadataReference ) as IAssemblySymbol ;
@@ -318,13 +328,14 @@ private MetadataReference CreateOrGetMetadataReferenceFromPath(string path, Immu
318
328
if ( ! _loadedAssemblies . TryGetValue ( name , out MetadataReference ? metadataReference ) )
319
329
{
320
330
using FileStream stream = File . OpenRead ( path ) ;
321
- metadataReference = CreateAndAddReferenceToCompilation ( name , stream , referenceAssemblyNamesToIgnore ) ;
331
+ string rootAssemblyDisplayString = string . Format ( Resources . RootAssemblyDisplayString , path ) ;
332
+ metadataReference = CreateAndAddReferenceToCompilation ( name , rootAssemblyDisplayString , stream , referenceAssemblyNamesToIgnore ) ;
322
333
}
323
334
324
335
return metadataReference ;
325
336
}
326
337
327
- private MetadataReference CreateAndAddReferenceToCompilation ( string name , Stream fileStream , ImmutableHashSet < string > ? referenceAssemblyNamesToIgnore = null )
338
+ private MetadataReference CreateAndAddReferenceToCompilation ( string assemblyName , string rootAssemblyDisplayString , Stream fileStream , ImmutableHashSet < string > ? referenceAssemblyNamesToIgnore = null , string ? referenceeAssemblyName = null )
328
339
{
329
340
// If we need to resolve references we can't reuse the same stream after creating the metadata
330
341
// reference from it as Roslyn closes it. So instead we use PEReader and get the bytes
@@ -333,51 +344,60 @@ private MetadataReference CreateAndAddReferenceToCompilation(string name, Stream
333
344
334
345
if ( ! reader . HasMetadata )
335
346
{
336
- throw new ArgumentException ( string . Format ( Resources . ProvidedStreamDoesNotHaveMetadata , name ) ) ;
347
+ throw new ArgumentException ( string . Format ( Resources . ProvidedStreamDoesNotHaveMetadata , assemblyName ) ) ;
337
348
}
338
349
339
350
PEMemoryBlock image = reader . GetEntireImage ( ) ;
340
351
MetadataReference metadataReference = MetadataReference . CreateFromImage ( image . GetContent ( ) ) ;
341
- _loadedAssemblies . Add ( name , metadataReference ) ;
352
+ _loadedAssemblies . Add ( assemblyName , metadataReference ) ;
342
353
_cSharpCompilation = _cSharpCompilation . AddReferences ( [ metadataReference ] ) ;
343
354
355
+ if ( referenceeAssemblyName is null )
356
+ {
357
+ _log . LogMessage ( MessageImportance . Low , string . Format ( Resources . AssemblyLoaded , assemblyName ) ) ;
358
+ }
359
+ else
360
+ {
361
+ _log . LogMessage ( MessageImportance . Low , string . Format ( Resources . AssemblyReferenceLoaded , assemblyName , referenceeAssemblyName ) ) ;
362
+ }
363
+
344
364
if ( _resolveReferences )
345
365
{
346
- ResolveReferences ( reader , referenceAssemblyNamesToIgnore ) ;
366
+ ResolveReferences ( reader , assemblyName , rootAssemblyDisplayString , referenceAssemblyNamesToIgnore ) ;
347
367
}
348
368
349
369
return metadataReference ;
350
370
}
351
371
352
- private void ResolveReferences ( PEReader peReader , ImmutableHashSet < string > ? referenceAssemblyNamesToIgnore = null )
372
+ private void ResolveReferences ( PEReader peReader , string assemblyName , string rootAssemblyDisplayString , ImmutableHashSet < string > ? referenceAssemblyNamesToIgnore = null )
353
373
{
354
374
MetadataReader reader = peReader . GetMetadataReader ( ) ;
355
- foreach ( AssemblyReferenceHandle handle in reader . AssemblyReferences )
375
+ foreach ( AssemblyReferenceHandle assemblyReferenceHandle in reader . AssemblyReferences )
356
376
{
357
- AssemblyReference reference = reader . GetAssemblyReference ( handle ) ;
358
- string nameWithoutExtension = reader . GetString ( reference . Name ) ;
377
+ AssemblyReference assemblyReference = reader . GetAssemblyReference ( assemblyReferenceHandle ) ;
378
+ string assemblyReferenceNameWithoutExtension = reader . GetString ( assemblyReference . Name ) ;
359
379
360
380
// Skip assemblies that should never get loaded because they are purely internal
361
- if ( s_assembliesToIgnore . Contains ( nameWithoutExtension ) )
381
+ if ( s_assembliesToIgnore . Contains ( assemblyReferenceNameWithoutExtension ) )
362
382
continue ;
363
383
364
- string name = nameWithoutExtension + ".dll" ;
384
+ string assemblyReferenceName = assemblyReferenceNameWithoutExtension + ".dll" ;
365
385
366
386
// Skip reference assemblies that are loaded later.
367
- if ( referenceAssemblyNamesToIgnore != null && referenceAssemblyNamesToIgnore . Contains ( name ) )
387
+ if ( referenceAssemblyNamesToIgnore != null && referenceAssemblyNamesToIgnore . Contains ( assemblyReferenceName ) )
368
388
continue ;
369
389
370
390
// If the assembly reference is already loaded, don't do anything.
371
- if ( _loadedAssemblies . ContainsKey ( name ) )
391
+ if ( _loadedAssemblies . ContainsKey ( assemblyReferenceName ) )
372
392
continue ;
373
393
374
394
// First we try to see if a reference path for this specific assembly was passed in directly, and if so
375
395
// we use that.
376
- if ( _referencePathFiles . TryGetValue ( name , out string ? fullReferencePath ) )
396
+ if ( _referencePathFiles . TryGetValue ( assemblyReferenceName , out string ? fullReferencePath ) )
377
397
{
378
398
// TODO: add version check and add a warning if it doesn't match?
379
- using FileStream resolvedStream = File . OpenRead ( Path . Combine ( fullReferencePath , name ) ) ;
380
- CreateAndAddReferenceToCompilation ( name , resolvedStream , referenceAssemblyNamesToIgnore ) ;
399
+ using FileStream resolvedStream = File . OpenRead ( Path . Combine ( fullReferencePath , assemblyReferenceName ) ) ;
400
+ CreateAndAddReferenceToCompilation ( assemblyReferenceName , rootAssemblyDisplayString , resolvedStream , referenceAssemblyNamesToIgnore , assemblyName ) ;
381
401
}
382
402
// If we can't find a specific reference path for the dependency, then we look in the folders where the
383
403
// rest of the reference paths are located to see if we can find the dependency there.
@@ -387,20 +407,21 @@ private void ResolveReferences(PEReader peReader, ImmutableHashSet<string>? refe
387
407
388
408
foreach ( string referencePathDirectory in _referencePathDirectories )
389
409
{
390
- string potentialPath = Path . Combine ( referencePathDirectory , name ) ;
410
+ string potentialPath = Path . Combine ( referencePathDirectory , assemblyReferenceName ) ;
391
411
if ( File . Exists ( potentialPath ) )
392
412
{
393
413
// TODO: add version check and add a warning if it doesn't match?
394
414
using FileStream resolvedStream = File . OpenRead ( potentialPath ) ;
395
- CreateAndAddReferenceToCompilation ( name , resolvedStream , referenceAssemblyNamesToIgnore ) ;
415
+ CreateAndAddReferenceToCompilation ( assemblyReferenceName , rootAssemblyDisplayString , resolvedStream , referenceAssemblyNamesToIgnore , assemblyName ) ;
396
416
found = true ;
397
417
break ;
398
418
}
399
419
}
400
420
401
421
if ( ! found )
402
422
{
403
- _log . LogWarning ( AssemblyReferenceNotFoundErrorCode , string . Format ( Resources . CouldNotResolveReference , name ) ) ;
423
+ _log . LogWarning ( AssemblyReferenceNotFoundErrorCode ,
424
+ string . Format ( Resources . CouldNotResolveReference , assemblyReferenceName , rootAssemblyDisplayString ) ) ;
404
425
}
405
426
}
406
427
}
0 commit comments