Re-use (our) Fusion assembly name parser in AssemblyName.

This commit is contained in:
jfrijters 2011-11-08 09:49:26 +00:00
Родитель 1937f8b4c9
Коммит a1b44a7b58
3 изменённых файлов: 72 добавлений и 12 удалений

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

@ -50,14 +50,75 @@ namespace IKVM.Reflection
public AssemblyName(string assemblyName)
{
// HACK use the real AssemblyName to parse the string
System.Reflection.AssemblyName impl = new System.Reflection.AssemblyName(assemblyName);
name = impl.Name;
culture = impl.CultureInfo == null ? null : impl.CultureInfo.Name;
version = impl.Version;
publicKeyToken = impl.GetPublicKeyToken();
flags = (AssemblyNameFlags)(int)impl.Flags;
ProcessorArchitecture = (ProcessorArchitecture)impl.ProcessorArchitecture;
if (assemblyName == null)
{
throw new ArgumentNullException("assemblyName");
}
if (assemblyName == "")
{
throw new ArgumentException();
}
ParsedAssemblyName parsed;
switch (Fusion.ParseAssemblyName(assemblyName, out parsed))
{
case ParseAssemblyResult.GenericError:
throw new FileLoadException();
case ParseAssemblyResult.DuplicateKey:
throw new System.Runtime.InteropServices.COMException();
}
name = parsed.Name;
if (parsed.Culture != null)
{
if (parsed.Culture.Equals("neutral", StringComparison.InvariantCultureIgnoreCase))
{
culture = "";
}
else if (parsed.Culture == "")
{
throw new FileLoadException();
}
else
{
culture = new CultureInfo(parsed.Culture).Name;
}
}
if (parsed.Version != null && parsed.Version.Major != 65535 && parsed.Version.Minor != 65535)
{
// our Fusion parser returns -1 for build and revision for incomplete version numbers (and we want 65535)
version = new Version(parsed.Version.Major, parsed.Version.Minor, parsed.Version.Build & 0xFFFF, parsed.Version.Revision & 0xFFFF);
}
if (parsed.PublicKeyToken != null)
{
if (parsed.PublicKeyToken.Equals("null", StringComparison.InvariantCultureIgnoreCase))
{
publicKeyToken = Empty<byte>.Array;
}
else if (parsed.PublicKeyToken.Length != 16)
{
throw new FileLoadException();
}
else
{
publicKeyToken = new byte[8];
for (int i = 0, pos = 0; i < publicKeyToken.Length; i++, pos += 2)
{
publicKeyToken[i] = (byte)("0123456789abcdef".IndexOf(char.ToLowerInvariant(parsed.PublicKeyToken[pos])) * 16
+ "0123456789abcdef".IndexOf(char.ToLowerInvariant(parsed.PublicKeyToken[pos + 1])));
}
}
}
if (parsed.Retargetable.HasValue)
{
if (parsed.Culture == null || parsed.PublicKeyToken == null || parsed.Version == null || parsed.Version.Build == -1 || parsed.Version.Revision == -1)
{
throw new FileLoadException();
}
if (parsed.Retargetable.Value)
{
flags |= AssemblyNameFlags.Retargetable;
}
}
ProcessorArchitecture = parsed.ProcessorArchitecture;
}
public override string ToString()

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

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

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

@ -256,8 +256,7 @@ namespace IKVM.Reflection
return false;
}
// note that this is the fusion specific parser, it is not the same as System.Reflection.AssemblyName
private static ParseAssemblyResult ParseAssemblyName(string fullName, out ParsedAssemblyName parsedName)
internal static ParseAssemblyResult ParseAssemblyName(string fullName, out ParsedAssemblyName parsedName)
{
parsedName = new ParsedAssemblyName();
StringBuilder sb = new StringBuilder();
@ -512,7 +511,7 @@ namespace IKVM.Reflection
return false;
}
// HACK use AssemblyName to convert PublicKey to PublicKeyToken
byte[] token = new AssemblyName("Foo, PublicKey=" + str).GetPublicKeyToken();
byte[] token = new System.Reflection.AssemblyName("Foo, PublicKey=" + str).GetPublicKeyToken();
StringBuilder sb = new StringBuilder(token.Length * 2);
for (int i = 0; i < token.Length; i++)
{