зеркало из https://github.com/mono/ikvm-fork.git
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:
Родитель
17190174e1
Коммит
f20785de9f
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче