Fixed ResolveAssemblyRefImpl() to use AssemblyName.GetFullName() to fix a number of bugs:

- Name was not escaped.
- Retargetable and ContentType attributes were not added.
- PublicKey was not converted to PublicKeyToken.
This commit is contained in:
jfrijters 2013-09-11 13:30:51 +00:00
Родитель 17190174e1
Коммит f20785de9f
2 изменённых файлов: 9 добавлений и 28 удалений

Просмотреть файл

@ -312,7 +312,7 @@ namespace IKVM.Reflection
}
}
private static string GetFullName(string name, ushort versionMajor, ushort versionMinor, ushort versionBuild, ushort versionRevision, string culture, byte[] publicKeyToken, int flags)
internal static string GetFullName(string name, ushort versionMajor, ushort versionMinor, ushort versionBuild, ushort versionRevision, string culture, byte[] publicKeyToken, int flags)
{
StringBuilder sb = new StringBuilder();
bool doubleQuotes = name.StartsWith(" ") || name.EndsWith(" ") || name.IndexOf('\'') != -1;
@ -392,7 +392,7 @@ namespace IKVM.Reflection
return sb.ToString();
}
private static byte[] ComputePublicKeyToken(byte[] publicKey)
internal static byte[] ComputePublicKeyToken(byte[] publicKey)
{
if (publicKey.Length == 0)
{

Просмотреть файл

@ -95,12 +95,12 @@ namespace IKVM.Reflection.Reader
}
}
internal ModuleReader(AssemblyReader assembly, Universe universe, Stream stream, string location)
internal ModuleReader(AssemblyReader assembly, Universe universe, Stream stream, string location, bool mapped)
: base(universe)
{
this.stream = universe != null && universe.MetadataOnly ? null : stream;
this.location = location;
Read(stream);
Read(stream, mapped);
if (assembly == null && AssemblyTable.records.Length != 0)
{
assembly = new AssemblyReader(location, this);
@ -108,10 +108,10 @@ namespace IKVM.Reflection.Reader
this.assembly = assembly;
}
private void Read(Stream stream)
private void Read(Stream stream, bool mapped)
{
BinaryReader br = new BinaryReader(stream);
peFile.Read(br);
peFile.Read(br, mapped);
stream.Seek(peFile.RvaToFileOffset(peFile.GetComDescriptorVirtualAddress()), SeekOrigin.Begin);
cliHeader.Read(br);
stream.Seek(peFile.RvaToFileOffset(cliHeader.MetaData.VirtualAddress), SeekOrigin.Begin);
@ -511,37 +511,18 @@ namespace IKVM.Reflection.Reader
private Assembly ResolveAssemblyRefImpl(ref AssemblyRefTable.Record rec)
{
const int PublicKey = 0x0001;
string name = String.Format("{0}, Version={1}.{2}.{3}.{4}, Culture={5}, {6}={7}",
string name = AssemblyName.GetFullName(
GetString(rec.Name),
rec.MajorVersion,
rec.MinorVersion,
rec.BuildNumber,
rec.RevisionNumber,
rec.Culture == 0 ? "neutral" : GetString(rec.Culture),
(rec.Flags & PublicKey) == 0 ? "PublicKeyToken" : "PublicKey",
PublicKeyOrTokenToString(rec.PublicKeyOrToken));
rec.PublicKeyOrToken == 0 ? Empty<byte>.Array : (rec.Flags & PublicKey) == 0 ? GetBlobCopy(rec.PublicKeyOrToken) : AssemblyName.ComputePublicKeyToken(GetBlobCopy(rec.PublicKeyOrToken)),
rec.Flags);
return universe.Load(name, this, true);
}
private string PublicKeyOrTokenToString(int publicKeyOrToken)
{
if (publicKeyOrToken == 0)
{
return "null";
}
ByteReader br = GetBlob(publicKeyOrToken);
if (br.Length == 0)
{
return "null";
}
StringBuilder sb = new StringBuilder(br.Length * 2);
while (br.Length > 0)
{
sb.AppendFormat("{0:x2}", br.ReadByte());
}
return sb.ToString();
}
public override Guid ModuleVersionId
{
get