Hey,
The attached patch contains the latest suggestions of both Kornel and
Ben. Maybe the only thing to be noted is that I kept the hexadecimal
notation when comparing chars, since the same is used in
Char.GetNumericalValue ().
New tests are also attached, and run fine under .Net 2.0
Carlos.
Index: AssemblyName.cs
===================================================================
--- AssemblyName.cs (revisión: 48583)
+++ AssemblyName.cs (copia de trabajo)
@@ -37,6 +37,8 @@
using System.Text;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;
+using System.IO;
+using System.Collections.Generic;
using Mono.Security;
@@ -73,7 +75,6 @@
int processor_architecture;
#endif
#endregion
-
public AssemblyName ()
{
// defaults
@@ -81,11 +82,102 @@
}
#if NET_2_0
+ const string exceptionMessage = "The assembly name is invalid.";
+
public AssemblyName (string assemblyName)
{
- name = assemblyName;
+ string [] parts;
+
+ if (assemblyName == null)
+ throw new ArgumentNullException ("assemblyName");
+ if (assemblyName.Length < 1)
+ throw new ArgumentException ("assemblyName cannot have zero length", "assemblyName");
+
+ parts = assemblyName.Split (',');
+ name = parts [0].Trim ();
+ if (name.Length < 1)
+ throw new FileLoadException (exceptionMessage);
+
+ IComparer<string> comparer = StringComparer.OrdinalIgnoreCase;
+ for (int i = 1; i < parts.Length; i++) {
+ if (parts [i].IndexOf ('=') < 0)
+ throw new FileLoadException (exceptionMessage);
+
+ string [] values = parts [i].Split ('=');
+ values [0] = values [0].Trim ();
+ values [1] = values [1].Trim ();
+ if (values [0].Length < 1 || values [1].Length < 1)
+ throw new FileLoadException (exceptionMessage);
+
+ if (comparer.Compare (values [0], "Version") == 0) {
+ if (version != null)
+ throw new FileLoadException (exceptionMessage);
+ try {
+ version = new Version (values [1]);
+ } catch (ArgumentException) {
+ throw new FileLoadException (exceptionMessage);
+ } catch (FormatException) {
+ throw new FileLoadException (exceptionMessage);
+ }
+ } else if (comparer.Compare (values [0], "Culture") == 0) {
+ if (cultureinfo != null)
+ throw new FileLoadException (exceptionMessage);
+ if (comparer.Compare (values [1], "neutral") == 0)
+ values [1] = "";
+ cultureinfo = new CultureInfo (values [1]);
+ } else if (comparer.Compare (values [0], "PublicKeyToken") == 0) {
+ if (keyToken != null)
+ throw new FileLoadException (exceptionMessage);
+ ParsePublicKeyToken (values [1]);
+ } else if (comparer.Compare (values [0], "PublicKey") == 0) {
+ if (publicKey != null)
+ throw new FileLoadException (exceptionMessage);
+ ParsePublicKey (values [1]);
+ } else
+ throw new FileLoadException (exceptionMessage);
+ }
+
}
+ void ParsePublicKeyToken (string kToken)
+ {
+ if (kToken.Length != 16)
+ throw new FileLoadException (exceptionMessage);
+
+ keyToken = new byte [8];
+ for (int i = 0, j = 0; i < 8; i++) {
+ keyToken [i] = (byte) (GetCharNumericValue (kToken [j++]) << 4);
+ keyToken [i] |= (byte) GetCharNumericValue (kToken [j++]);
+ }
+ }
+
+ void ParsePublicKey (string key)
+ {
+ if (key.Length != 320)
+ throw new FileLoadException (exceptionMessage);
+
+ publicKey = new byte [160];
+ for (int i = 0, j = 0; i < 160; i++) {
+ publicKey [i] = (byte) (GetCharNumericValue (key [j++]) << 4);
+ publicKey [i] |= (byte) GetCharNumericValue (key [j++]);
+ }
+ flags = AssemblyNameFlags.PublicKey;
+ }
+
+ int GetCharNumericValue (char c)
+ {
+ if (c >= (char)0x30 && c <= (char)0x3B)
+ return c - 0x30; // 0-9
+ if (c >= (char)0x41 && c <= (char)0x46)
+ return c - 0x37; // A-F
+ if (c >= (char)0x61 && c <= (char)0x66)
+ return c - 0x57; // a-f
+
+ throw new FileLoadException (exceptionMessage);
+ }
+#endif
+
+#if NET_2_0
[MonoTODO]
public ProcessorArchitecture ProcessorArchitecture {
get {
Index: AssemblyNameTest.cs
===================================================================
--- AssemblyNameTest.cs (revisión: 48583)
+++ AssemblyNameTest.cs (copia de trabajo)
@@ -531,6 +531,228 @@
}
return tokenString;
}
+
+#if NET_2_0
+ [Test]
+ public void Ctor1 ()
+ {
+ const string assemblyName = "TestAssembly";
+ AssemblyName an = new AssemblyName (assemblyName);
+ Assert.IsNotNull (an.Name, "Ctor1#1");
+ Assert.AreEqual (an.Name, assemblyName, "Ctor1#2");
+ }
+
+ [Test]
+ public void Ctor2 ()
+ {
+ const string assemblyName = "TestAssembly";
+ const string assemblyVersion = "1.2.3.4";
+ AssemblyName an = new AssemblyName (assemblyName + ", Version=" + assemblyVersion);
+ Assert.IsNotNull (an.Name, "Ctor2#1");
+ Assert.AreEqual (an.Name, assemblyName, "Ctor2#2");
+ Assert.IsNotNull (an.Version, "Ctor2#3");
+ Assert.AreEqual (an.Version, new Version (assemblyVersion), "Ctor2#4");
+ }
+
+ [Test]
+ public void Ctor3 ()
+ {
+ const string assemblyName = "TestAssembly";
+ const string assemblyCulture = "en-US";
+ AssemblyName an = new AssemblyName (assemblyName + ", Culture=" + assemblyCulture);
+ Assert.IsNotNull (an.Name, "Ctor3#1");
+ Assert.AreEqual (an.Name, assemblyName, "Ctor3#2");
+ Assert.IsNotNull (an.CultureInfo, "Ctor3#3");
+ Assert.AreEqual (an.CultureInfo, new CultureInfo (assemblyCulture), "Ctor3#4");
+ }
+
+ [Test]
+ public void Ctor4 ()
+ {
+ const string assemblyName = "TestAssembly";
+ byte [] assemblyKeyToken;
+ AssemblyName an = new AssemblyName (assemblyName + ", PublicKeyToken=" + GetTokenString (token));
+ Assert.IsNotNull (an.Name, "Ctor4#1");
+ Assert.AreEqual (an.Name, assemblyName, "Ctor4#2");
+ Assert.IsNotNull (assemblyKeyToken = an.GetPublicKeyToken (), "Ctor4#3");
+ Assert.AreEqual (assemblyKeyToken, token, "Ctor4#4");
+ }
+
+ [Test]
+ public void Ctor5 ()
+ {
+ const string assemblyName = "TestAssembly";
+ const string assemblyCulture = "neutral";
+ const string assemblyVersion = "1.2.3.4";
+ byte [] assemblyKeyToken;
+
+ AssemblyName an = new AssemblyName (assemblyName + ", Version=" + assemblyVersion +
+ ", Culture=" + assemblyCulture + ", PublicKeyToken=" + GetTokenString (token));
+ Assert.IsNotNull (an.Name, "Ctor5#1");
+ Assert.AreEqual (an.Name, assemblyName, "Ctor5#2");
+ Assert.IsNotNull (an.CultureInfo, "Ctor5#3");
+ Assert.AreEqual (an.CultureInfo, new CultureInfo (""), "Ctor5#4");
+ Assert.IsNotNull (an.Version, "Ctor5#5");
+ Assert.AreEqual (an.Version, new Version (assemblyVersion), "Ctor5#6");
+ Assert.IsNotNull (assemblyKeyToken = an.GetPublicKeyToken (), "Ctor5#7");
+ Assert.AreEqual (assemblyKeyToken, token, "Ctor5#8");
+ }
+
+ [Test]
+ public void Ctor6 ()
+ {
+ const string assemblyName = "TestAssembly";
+ AssemblyName an = null;
+
+ // null argument
+ try {
+ an = new AssemblyName (null);
+ } catch (ArgumentNullException) {
+ }
+ Assert.IsNull (an, "Ctor6#1");
+
+ // empty string
+ an = null;
+ try {
+ an = new AssemblyName ("");
+ } catch (ArgumentException) {
+ }
+ Assert.IsNull (an, "Ctor6#2");
+
+ // name missing
+ an = null;
+ try {
+ an = new AssemblyName (", Version=1.4.5.6");
+ } catch (FileLoadException) {
+ }
+ Assert.IsNull (an, "Ctor6#3");
+
+ // incomplete entry
+ an = null;
+ try {
+ an = new AssemblyName (assemblyName + ", Version=,Culture=neutral");
+ } catch (FileLoadException) {
+ }
+ Assert.IsNull (an, "Ctor6#4");
+
+ // version repeated
+ an = null;
+ try {
+ an = new AssemblyName (assemblyName + ", Version=1.2.3.4, Version=1.4.5.6");
+ } catch (FileLoadException) {
+ }
+ Assert.IsNull (an, "Ctor6#5");
+
+ // bad format for Version
+ an = null;
+ try {
+ an = new AssemblyName (assemblyName + ", Version=1.-1.0.5");
+ } catch (FileLoadException) {
+ }
+ Assert.IsNull (an, "Ctor6#6");
+
+ // bad format for version
+ an = null;
+ try {
+ an = new AssemblyName (assemblyName + ", Version=a.b");
+ } catch (FileLoadException) {
+ }
+ Assert.IsNull (an, "Ctor6#7");
+
+ // culture repeated
+ an = null;
+ try {
+ an = new AssemblyName (assemblyName + ", Culture=neutral, Culture=en-US");
+ } catch (FileLoadException) {
+ }
+ Assert.IsNull (an, "Ctor6#8");
+
+ // bad culture info
+ an = null;
+ try {
+ an = new AssemblyName (assemblyName + ", Culture=aa-AA");
+ } catch (ArgumentException) {
+ }
+ Assert.IsNull (an, "Ctor6#9");
+
+ // key token repeated
+ an = null;
+ try {
+ an = new AssemblyName (assemblyName + ", PublicKeyToken=27576a8182a18822, PublicKeyToken=27576a8182a18822");
+ } catch (FileLoadException) {
+ }
+ Assert.IsNull (an, "Ctor6#10");
+
+ // incorrect length for key token
+ an = null;
+ try {
+ an = new AssemblyName (assemblyName + ", PublicKeyToken=27576a8182a188");
+ } catch (FileLoadException) {
+ }
+ Assert.IsNull (an, "Ctor6#11");
+
+ // Incorrect values
+ an = null;
+ try {
+ an = new AssemblyName (assemblyName + ", PublicKeyToken=27576H8182?18822");
+ } catch (FileLoadException) {
+ }
+ Assert.IsNull (an, "Ctor6#12");
+
+ // Incorrect length for key
+ an = null;
+ try {
+ an = new AssemblyName (assemblyName + ", PublicKey=" + "0024000004800000940000000602000000240000525341310004000011000000e39d99616f48cf7d6d59f345e485e713e89b8b1265a31b1a393e9894ee3fbddaf382dcaf4083dc31ee7a40a2a25c69c6d019fba9f37ec17fd680e4f6fe3b5305f71ae9e494e3501d92508c2e98ca1e22991a217aa8ce259c9882ffdfff4fbc6fa5e6660a8ff951cd94ed011e5633651b64e8f4522519b6ec84921ee22e4840e");
+ } catch (FileLoadException) {
+ }
+ Assert.IsNull (an, "Ctor6#13");
+
+ // missing spec
+ an = null;
+ try {
+ an = new AssemblyName (assemblyName + ", =1.2.4.5");
+ } catch (FileLoadException) {
+ }
+ Assert.IsNull (an, "Ctor6#14");
+
+ // wrong values
+ an = null;
+ try {
+ an = new AssemblyName (assemblyName + ", OtherAttribute=someval");
+ } catch (FileLoadException) {
+ }
+ Assert.IsNull (an, "Ctor6#15");
+
+ // No '=' found
+ an = null;
+ try {
+ an = new AssemblyName (assemblyName + ", OtherAttribute");
+ } catch (FileLoadException) {
+ }
+ Assert.IsNull (an, "Ctor6#16");
+ }
+
+ [Test]
+ public void Ctor7 ()
+ {
+ const string assemblyName = "TestAssembly";
+ const string assemblyCulture = "neutral";
+ const string assemblyVersion = "1.2.3.4";
+ byte [] assemblyKeyToken;
+
+ AssemblyName an = new AssemblyName (assemblyName + ", VERSION = " + assemblyVersion +
+ ", CULTURE = " + assemblyCulture + ", PUBLICKEYTOKEN = " + GetTokenString (token));
+ Assert.IsNotNull (an.Name, "Ctor7#1");
+ Assert.AreEqual (an.Name, assemblyName, "Ctor7#2");
+ Assert.IsNotNull (an.CultureInfo, "Ctor7#3");
+ Assert.AreEqual (an.CultureInfo, new CultureInfo (""), "Ctor7#4");
+ Assert.IsNotNull (an.Version, "Ctor7#5");
+ Assert.AreEqual (an.Version, new Version (assemblyVersion), "Ctor7#6");
+ Assert.IsNotNull (assemblyKeyToken = an.GetPublicKeyToken (), "Ctor7#7");
+ Assert.AreEqual (assemblyKeyToken, token, "Ctor7#8");
+ }
+
+#endif
}
}
_______________________________________________
Mono-devel-list mailing list
[email protected]
http://lists.ximian.com/mailman/listinfo/mono-devel-list