Browse Source

Make sure mappingInfo is not null when passed to typedefs, methoddefs, properties and events.

pull/1763/head
Siegfried Pammer 6 years ago
parent
commit
d0f32b93c1
  1. 32
      ICSharpCode.Decompiler/CSharp/RequiredNamespaceCollector.cs
  2. 3
      ILSpy/LoadedAssembly.cs

32
ICSharpCode.Decompiler/CSharp/RequiredNamespaceCollector.cs

@ -55,10 +55,10 @@ namespace ICSharpCode.Decompiler.CSharp @@ -55,10 +55,10 @@ namespace ICSharpCode.Decompiler.CSharp
{
if (entity == null || entity.MetadataToken.IsNil)
return;
if (mappingInfo == null)
mappingInfo = CSharpDecompiler.GetCodeMappingInfo(entity.ParentModule.PEFile, entity.MetadataToken);
switch (entity) {
case ITypeDefinition td:
if (mappingInfo == null)
mappingInfo = CSharpDecompiler.GetCodeMappingInfo(entity.ParentModule.PEFile, entity.MetadataToken);
namespaces.Add(td.Namespace);
HandleAttributes(td.GetAttributes());
HandleTypeParameters(td.TypeParameters);
@ -100,23 +100,19 @@ namespace ICSharpCode.Decompiler.CSharp @@ -100,23 +100,19 @@ namespace ICSharpCode.Decompiler.CSharp
CollectNamespacesForTypeReference(param.Type);
}
HandleTypeParameters(method.TypeParameters);
if (!method.MetadataToken.IsNil) {
if (mappingInfo == null)
mappingInfo = CSharpDecompiler.GetCodeMappingInfo(entity.ParentModule.PEFile, entity.MetadataToken);
var reader = module.PEFile.Reader;
var parts = mappingInfo.GetMethodParts((MethodDefinitionHandle)method.MetadataToken).ToList();
foreach (var part in parts) {
HandleOverrides(part.GetMethodImplementations(module.metadata), module);
var methodDef = module.metadata.GetMethodDefinition(part);
if (method.HasBody) {
MethodBodyBlock body;
try {
body = reader.GetMethodBody(methodDef.RelativeVirtualAddress);
} catch (BadImageFormatException) {
continue;
}
CollectNamespacesFromMethodBody(body, module);
var reader = module.PEFile.Reader;
var parts = mappingInfo.GetMethodParts((MethodDefinitionHandle)method.MetadataToken).ToList();
foreach (var part in parts) {
HandleOverrides(part.GetMethodImplementations(module.metadata), module);
var methodDef = module.metadata.GetMethodDefinition(part);
if (method.HasBody) {
MethodBodyBlock body;
try {
body = reader.GetMethodBody(methodDef.RelativeVirtualAddress);
} catch (BadImageFormatException) {
continue;
}
CollectNamespacesFromMethodBody(body, module);
}
}
break;

3
ILSpy/LoadedAssembly.cs

@ -156,7 +156,8 @@ namespace ICSharpCode.ILSpy @@ -156,7 +156,8 @@ namespace ICSharpCode.ILSpy
// runs on background thread
if (state is Stream stream) {
// Read the module from a precrafted stream
module = new PEFile(fileName, stream, stream is MemoryStream ? PEStreamOptions.PrefetchEntireImage : PEStreamOptions.Default, metadataOptions: options);
var streamOptions = stream is MemoryStream ? PEStreamOptions.PrefetchEntireImage : PEStreamOptions.Default;
module = new PEFile(fileName, stream, streamOptions, metadataOptions: options);
} else {
// Read the module from disk (by default)
stream = new FileStream(fileName, FileMode.Open, FileAccess.Read);

Loading…
Cancel
Save