mirror of https://github.com/icsharpcode/ILSpy.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
2.4 KiB
78 lines
2.4 KiB
using System; |
|
using System.Collections.Generic; |
|
using System.Linq; |
|
using System.Reflection.Metadata; |
|
using System.Reflection.PortableExecutable; |
|
|
|
namespace ICSharpCode.Decompiler |
|
{ |
|
public static class DotNetCorePathFinderExtensions |
|
{ |
|
public static string DetectTargetFrameworkId(this PEReader assembly) |
|
{ |
|
if (assembly == null) |
|
throw new ArgumentNullException(nameof(assembly)); |
|
|
|
const string TargetFrameworkAttributeName = "System.Runtime.Versioning.TargetFrameworkAttribute"; |
|
var reader = assembly.GetMetadataReader(); |
|
|
|
foreach (var h in reader.GetCustomAttributes(Handle.AssemblyDefinition)) { |
|
var attribute = reader.GetCustomAttribute(h); |
|
if (attribute.GetAttributeType(reader).ToString() != TargetFrameworkAttributeName) |
|
continue; |
|
var blobReader = reader.GetBlobReader(attribute.Value); |
|
if (blobReader.ReadUInt16() == 0x0001) { |
|
return blobReader.ReadSerializedString(); |
|
} |
|
} |
|
|
|
return string.Empty; |
|
} |
|
} |
|
|
|
public class ReferenceLoadInfo |
|
{ |
|
readonly Dictionary<string, UnresolvedAssemblyNameReference> loadedAssemblyReferences = new Dictionary<string, UnresolvedAssemblyNameReference>(); |
|
|
|
public void AddMessage(string fullName, MessageKind kind, string message) |
|
{ |
|
lock (loadedAssemblyReferences) { |
|
if (!loadedAssemblyReferences.TryGetValue(fullName, out var referenceInfo)) { |
|
referenceInfo = new UnresolvedAssemblyNameReference(fullName); |
|
loadedAssemblyReferences.Add(fullName, referenceInfo); |
|
} |
|
referenceInfo.Messages.Add((kind, message)); |
|
} |
|
} |
|
|
|
public void AddMessageOnce(string fullName, MessageKind kind, string message) |
|
{ |
|
lock (loadedAssemblyReferences) { |
|
if (!loadedAssemblyReferences.TryGetValue(fullName, out var referenceInfo)) { |
|
referenceInfo = new UnresolvedAssemblyNameReference(fullName); |
|
loadedAssemblyReferences.Add(fullName, referenceInfo); |
|
referenceInfo.Messages.Add((kind, message)); |
|
} else { |
|
var lastMsg = referenceInfo.Messages.LastOrDefault(); |
|
if (kind != lastMsg.Item1 && message != lastMsg.Item2) |
|
referenceInfo.Messages.Add((kind, message)); |
|
} |
|
} |
|
} |
|
|
|
public bool TryGetInfo(string fullName, out UnresolvedAssemblyNameReference info) |
|
{ |
|
lock (loadedAssemblyReferences) { |
|
return loadedAssemblyReferences.TryGetValue(fullName, out info); |
|
} |
|
} |
|
|
|
public bool HasErrors { |
|
get { |
|
lock (loadedAssemblyReferences) { |
|
return loadedAssemblyReferences.Any(i => i.Value.HasErrors); |
|
} |
|
} |
|
} |
|
} |
|
}
|
|
|