Bug fix. Changed AssemblyName.ProcessorArchitecture to match (weird) .NET behavior. When reading the property it returns the architecture of the PE file, not the field from the AssemblyDef record.

This commit is contained in:
jfrijters 2012-10-24 17:08:07 +00:00
Родитель ce6eea67d0
Коммит fb7cbe4bfd
3 изменённых файлов: 36 добавлений и 2 удалений

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

@ -42,6 +42,7 @@ namespace IKVM.Reflection
private AssemblyNameFlags flags;
private AssemblyHashAlgorithm hashAlgorithm;
private AssemblyVersionCompatibility versionCompatibility = AssemblyVersionCompatibility.SameMachine;
private ProcessorArchitecture processorArchitecture;
private string codeBase;
internal byte[] hash;
@ -213,11 +214,12 @@ namespace IKVM.Reflection
public ProcessorArchitecture ProcessorArchitecture
{
get { return (ProcessorArchitecture)(((int)flags & 0x70) >> 4); }
get { return processorArchitecture; }
set
{
if (value >= ProcessorArchitecture.None && value <= ProcessorArchitecture.Arm)
{
processorArchitecture = value;
flags = (flags & ~(AssemblyNameFlags)0x70) | (AssemblyNameFlags)((int)value << 4);
}
}

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

@ -222,7 +222,8 @@ namespace IKVM.Reflection
IA64 = 3,
Amd64 = 4,
Arm = 5,
// if an item is added here, make sure to update AssemblyName.ProcessorArchitecture and Fusion.ParseAssemblyName as well
// if an item is added here, make sure to update AssemblyName.ProcessorArchitecture,
// AssemblyReader.GetNameImpl() and Fusion.ParseAssemblyName as well
}
[Flags]

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

@ -77,6 +77,37 @@ namespace IKVM.Reflection.Reader
}
name.HashAlgorithm = (AssemblyHashAlgorithm)rec.HashAlgId;
name.CodeBase = this.CodeBase;
PortableExecutableKinds peKind;
ImageFileMachine machine;
manifestModule.GetPEKind(out peKind, out machine);
switch (machine)
{
case ImageFileMachine.I386:
// FXBUG we copy the .NET bug that Preferred32Bit implies x86
if ((peKind & (PortableExecutableKinds.Required32Bit | PortableExecutableKinds.Preferred32Bit)) != 0)
{
name.ProcessorArchitecture = ProcessorArchitecture.X86;
}
else if ((rec.Flags & 0x70) == 0x70)
{
// it's a reference assembly
name.ProcessorArchitecture = ProcessorArchitecture.None;
}
else
{
name.ProcessorArchitecture = ProcessorArchitecture.MSIL;
}
break;
case ImageFileMachine.IA64:
name.ProcessorArchitecture = ProcessorArchitecture.IA64;
break;
case ImageFileMachine.AMD64:
name.ProcessorArchitecture = ProcessorArchitecture.Amd64;
break;
case ImageFileMachine.ARM:
name.ProcessorArchitecture = ProcessorArchitecture.Arm;
break;
}
name.RawFlags = (AssemblyNameFlags)rec.Flags;
return name;
}