internal static ImmutableArray <PortableExecutableReference> ResolveMetadataReference(CommandLineReference cmdReference, MetadataReferenceResolver metadataResolver, List <DiagnosticInfo> diagnosticsOpt, CommonMessageProvider messageProviderOpt) { Debug.Assert(metadataResolver != null); Debug.Assert((diagnosticsOpt == null) == (messageProviderOpt == null)); ImmutableArray <PortableExecutableReference> references; try { references = metadataResolver.ResolveReference(cmdReference.Reference, baseFilePath: null, properties: cmdReference.Properties); } catch (Exception e) when(diagnosticsOpt != null && (e is BadImageFormatException || e is IOException)) { var diagnostic = PortableExecutableReference.ExceptionToDiagnostic(e, messageProviderOpt, Location.None, cmdReference.Reference, cmdReference.Properties.Kind); diagnosticsOpt.Add(((DiagnosticWithInfo)diagnostic).Info); return(ImmutableArray <PortableExecutableReference> .Empty); } if (references.IsDefaultOrEmpty && diagnosticsOpt != null) { diagnosticsOpt.Add(new DiagnosticInfo(messageProviderOpt, messageProviderOpt.ERR_MetadataFileNotFound, cmdReference.Reference)); return(ImmutableArray <PortableExecutableReference> .Empty); } return(references); }
// TODO: change to private protected when available internal static MetadataReference ResolveMetadataReference(CommandLineReference cmdReference, MetadataReferenceResolver metadataResolver, MetadataReferenceProvider metadataProvider, List <DiagnosticInfo> diagnosticsOpt, CommonMessageProvider messageProviderOpt) { Debug.Assert(metadataResolver != null); Debug.Assert(metadataProvider != null); Debug.Assert((diagnosticsOpt == null) == (messageProviderOpt == null)); string resolvedPath = metadataResolver.ResolveReference(cmdReference.Reference, baseFilePath: null); if (resolvedPath == null) { if (diagnosticsOpt != null) { diagnosticsOpt.Add(new DiagnosticInfo(messageProviderOpt, messageProviderOpt.ERR_MetadataFileNotFound, cmdReference.Reference)); } return(null); } try { return(metadataProvider.GetReference(resolvedPath, cmdReference.Properties)); } catch (Exception e) if (diagnosticsOpt != null && (e is BadImageFormatException || e is IOException)) { var diagnostic = PortableExecutableReference.ExceptionToDiagnostic(e, messageProviderOpt, Location.None, cmdReference.Reference, cmdReference.Properties.Kind); diagnosticsOpt.Add(((DiagnosticWithInfo)diagnostic).Info); return(null); } }
/// <summary> /// Creates or gets metadata for PE reference. /// </summary> /// <remarks> /// If any of the following exceptions: <see cref="BadImageFormatException"/>, <see cref="FileNotFoundException"/>, <see cref="IOException"/>, /// are thrown while reading the metadata file, the exception is caught and an appropriate diagnostic stored in <paramref name="diagnostics"/>. /// </remarks> private Metadata GetMetadata(PortableExecutableReference peReference, CommonMessageProvider messageProvider, Location location, DiagnosticBag diagnostics) { Metadata existingMetadata; lock (ObservedMetadata) { if (TryGetObservedMetadata(peReference, diagnostics, out existingMetadata)) { return(existingMetadata); } } Metadata newMetadata; Diagnostic newDiagnostic = null; try { newMetadata = peReference.GetMetadataNoCopy(); // make sure basic structure of the PE image is valid: var assemblyMetadata = newMetadata as AssemblyMetadata; if (assemblyMetadata != null) { bool dummy = assemblyMetadata.IsValidAssembly(); } else { bool dummy = ((ModuleMetadata)newMetadata).Module.IsLinkedModule; } } catch (Exception e) when(e is BadImageFormatException || e is IOException) { newDiagnostic = PortableExecutableReference.ExceptionToDiagnostic(e, messageProvider, location, peReference.Display, peReference.Properties.Kind); newMetadata = null; } lock (ObservedMetadata) { if (TryGetObservedMetadata(peReference, diagnostics, out existingMetadata)) { return(existingMetadata); } if (newDiagnostic != null) { diagnostics.Add(newDiagnostic); } ObservedMetadata.Add(peReference, (MetadataOrDiagnostic)newMetadata ?? newDiagnostic); return(newMetadata); } }
/// <summary> /// Creates or gets metadata for PE reference. /// </summary> /// <remarks> /// If any of the following exceptions: <see cref="BadImageFormatException"/>, <see cref="FileNotFoundException"/>, <see cref="IOException"/>, /// are thrown while reading the metadata file, the exception is caught and an appropriate diagnostic stored in <paramref name="diagnostics"/>. /// </remarks> private Metadata GetMetadata(PortableExecutableReference peReference, CommonMessageProvider messageProvider, Location location, DiagnosticBag diagnostics) { Metadata existingMetadata; lock (ObservedMetadata) { if (TryGetObservedMetadata(peReference, diagnostics, out existingMetadata)) { return(existingMetadata); } } Metadata newMetadata = null; Diagnostic newDiagnostic = null; try { newMetadata = peReference.GetMetadata(); } catch (Exception e) { if (e is BadImageFormatException || e is IOException) { newDiagnostic = PortableExecutableReference.ExceptionToDiagnostic(e, messageProvider, location, peReference.Display, peReference.Properties.Kind); } } lock (ObservedMetadata) { if (TryGetObservedMetadata(peReference, diagnostics, out existingMetadata)) { return(existingMetadata); } if (newDiagnostic != null) { diagnostics.Add(newDiagnostic); } ObservedMetadata.Add(peReference, (MetadataOrDiagnostic)newMetadata ?? newDiagnostic); return(newMetadata); } }