提交 ca37f819 编写于 作者: M Manish Vasani

Gracefully handle documented exceptions from AssemblyMetadata.GetModules

We have done so in past for other callsites to this API, such as #17687. This change does the same for the remaining two callsites in the IDE layer.

Fixes VSO Watson [234447](https://devdiv.visualstudio.com/DevDiv/_queries/edit/234447): [Watson] clr20r3: CLR_EXCEPTION_System.BadImageFormatException_8007000b_Microsoft.CodeAnalysis.dll!Microsoft.CodeAnalysis.PEModule.get_ReferencedAssemblies
上级 19628761
......@@ -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<ModuleMetadata> 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)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册