diff --git a/src/Workspaces/Core/Portable/Execution/AbstractReferenceSerializationService.cs b/src/Workspaces/Core/Portable/Execution/AbstractReferenceSerializationService.cs index 70e3926ce4c90b099cc9b9d6837b530fbd50057a..c35380ed573ad461c3b57c3de0e8474c6d7fa3b9 100644 --- a/src/Workspaces/Core/Portable/Execution/AbstractReferenceSerializationService.cs +++ b/src/Workspaces/Core/Portable/Execution/AbstractReferenceSerializationService.cs @@ -304,9 +304,14 @@ private void WriteMvidsTo(Metadata metadata, ObjectWriter writer, CancellationTo if (metadata is AssemblyMetadata assemblyMetadata) { + if (!TryGetModules(assemblyMetadata, out var modules)) + { + // Gracefully bail out without writing anything to the writer. + return; + } + writer.WriteInt32((int)assemblyMetadata.Kind); - var modules = assemblyMetadata.GetModules(); writer.WriteInt32(modules.Length); foreach (var module in modules) @@ -320,6 +325,23 @@ private void WriteMvidsTo(Metadata metadata, ObjectWriter writer, CancellationTo WriteMvidTo((ModuleMetadata)metadata, writer, cancellationToken); } + private static bool TryGetModules(AssemblyMetadata assemblyMetadata, out ImmutableArray modules) + { + // Gracefully handle documented exceptions from 'GetModules' invocation. + try + { + modules = assemblyMetadata.GetModules(); + return true; + } + catch (Exception ex) when (ex is BadImageFormatException || + ex is IOException || + ex is ObjectDisposedException) + { + modules = default; + return false; + } + } + private void WriteMvidTo(ModuleMetadata metadata, ObjectWriter writer, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); @@ -411,9 +433,15 @@ private void WriteTo(Metadata metadata, ObjectWriter writer, CancellationToken c if (metadata is AssemblyMetadata assemblyMetadata) { + if (!TryGetModules(assemblyMetadata, out var modules)) + { + // Gracefully handle error case where unable to get modules. + writer.WriteInt32(MetadataFailed); + return; + } + writer.WriteInt32((int)assemblyMetadata.Kind); - var modules = assemblyMetadata.GetModules(); writer.WriteInt32(modules.Length); foreach (var module in modules)