In the last message some attachments were missing. 
All of them are now correctly attached.
Index: AssemblyName.cs
===================================================================
--- AssemblyName.cs	(revisión: 48211)
+++ AssemblyName.cs	(copia de trabajo)
@@ -37,6 +37,7 @@
 using System.Text;
 using System.Runtime.InteropServices;
 using System.Runtime.CompilerServices;
+using System.IO;
 
 using Mono.Security;
 
@@ -73,6 +74,7 @@
 		int processor_architecture;
 #endif
         #endregion
+		static readonly char [] delimiter = {','};
 		
 		public AssemblyName ()
 		{
@@ -83,9 +85,64 @@
 #if NET_2_0
 		public AssemblyName (string assemblyName)
 		{
-			name = assemblyName;
+			string [] parts;
+
+			if (assemblyName == null)
+				throw new ArgumentNullException ("assemblyName");
+			if (assemblyName == "")
+				throw new ArgumentException ("assemblyName cannot have zero length", "assemblyName");
+			
+			// Remove white spaces, to mimic .Net behavior
+			assemblyName = assemblyName.Replace (" ", "");
+			parts = assemblyName.Split (delimiter);
+			if (parts [0] == "")
+				throw new FileLoadException ("The assembly name is invalid.");
+
+			name = parts [0];
+			for (int i = 0; i < parts.Length; i++) {
+				try {
+					if (String.Compare (parts [i], 0, "Version=", 0, 8, true, CultureInfo.InvariantCulture) == 0)
+						version = new Version (parts [i].Substring (8, parts [i].Length - 8));
+					else if (String.Compare (parts [i], 0, "Culture=", 0, 8, true, CultureInfo.InvariantCulture) == 0) {
+						string culture = parts [i].Substring (8, parts [i].Length - 8);
+						if (String.Compare (culture, "neutral", true, CultureInfo.InvariantCulture) == 0)
+							culture = "";
+						cultureinfo = new CultureInfo (culture);
+					}
+					else if (String.Compare (parts [i], 0, "PublicKeyToken=", 0, 15, true, CultureInfo.InvariantCulture) == 0)
+						ParseKeyToken (parts [i].Substring (15, parts [i].Length - 15));
+					else if (String.Compare (parts [i], 0, "PublicKey=", 0, 10, true, CultureInfo.InvariantCulture) == 0)
+						ParseKey (parts [i].Substring (10, parts [i].Length - 10));
+				} catch {
+					throw new FileLoadException ("The assembly name is invalid.");
+				}
+			}
+			
 		}
 
+		[MethodImpl (MethodImplOptions.InternalCall)]
+		extern void InternalParseKeyToken (string keyToken);
+		
+		void ParseKeyToken (string kToken)
+		{
+			if (kToken.Length != 16)
+				throw new Exception ();
+
+			InternalParseKeyToken (kToken);
+		}
+
+		[MethodImpl (MethodImplOptions.InternalCall)]
+		extern void InternalParseKey (string key);
+		
+		void ParseKey (string key)
+		{
+			if (key.Length != 320)
+				throw new Exception ();
+			
+			flags = AssemblyNameFlags.PublicKey;
+			InternalParseKey (key);
+		}
+
 		[MonoTODO]
 		public ProcessorArchitecture ProcessorArchitecture {
 			get {
Index: AssemblyNameTest.cs
===================================================================
--- AssemblyNameTest.cs	(revisión: 48211)
+++ AssemblyNameTest.cs	(copia de trabajo)
@@ -19,6 +19,7 @@
 using System.Globalization;
 using System.Runtime.Serialization.Formatters.Binary;
 using System.Security;
+using System.Text;
 
 namespace MonoTests.System.Reflection {
 
@@ -531,6 +532,73 @@
 		}
 		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";
+		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");
+	}
+#endif
 }
 
 }
Index: icall.c
===================================================================
--- icall.c	(revisión: 48211)
+++ icall.c	(copia de trabajo)
@@ -3730,6 +3730,44 @@
 	return result;
 }
 
+static void
+ves_icall_System_Reflection_AssemblyName_InternalParseKeyToken (MonoReflectionAssemblyName *aname, MonoString *key_token)
+{
+	char *p, *token;
+	int i, j;
+
+	token = mono_string_to_utf8 (key_token);
+	aname->keyToken = mono_array_new (mono_domain_get (), mono_defaults.byte_class, 8);
+	p = mono_array_addr (aname->keyToken, char, 0);
+	for (i = 0, j = 0; i < 8; i++) {
+		*p = g_ascii_xdigit_value (token [j++]) << 4;
+		*p |= g_ascii_xdigit_value (token [j++]);
+		p++;
+	}
+
+	g_free (token);
+}
+
+static void
+ves_icall_System_Reflection_AssemblyName_InternalParseKey (MonoReflectionAssemblyName *aname, MonoString *public_key)
+{
+	char *p, *key;
+	int pkey_len, i, j;
+
+	key = mono_string_to_utf8 (public_key);
+	pkey_len = mono_string_length (public_key) / 2; // Format used in .Net
+
+	aname->publicKey = mono_array_new (mono_domain_get (), mono_defaults.byte_class, pkey_len);
+	p = mono_array_addr (aname->publicKey, char, 0);
+	for (i = 0, j = 0; i < pkey_len; i++) {
+		*p = g_ascii_xdigit_value (key [j++]) << 4;
+		*p |= g_ascii_xdigit_value (key [j++]);
+		p++;
+	}
+
+	g_free (key);
+}
+
 typedef struct {
 	MonoArray *res;
 	int idx;
@@ -6510,6 +6548,11 @@
 	{"load_with_partial_name", ves_icall_System_Reflection_Assembly_load_with_partial_name}
 };
 
+static const IcallEntry assembly_name_icalls [] = {
+	{"InternalParseKey", ves_icall_System_Reflection_AssemblyName_InternalParseKey},
+	{"InternalParseKeyToken", ves_icall_System_Reflection_AssemblyName_InternalParseKeyToken}
+};
+
 static const IcallEntry methodbase_icalls [] = {
 	{"GetCurrentMethod", ves_icall_GetCurrentMethod},
 	{"GetMethodBodyInternal", ves_icall_System_Reflection_MethodBase_GetMethodBodyInternal},
@@ -7046,6 +7089,7 @@
 	{"System.Net.Sockets.SocketException", socketex_icalls, G_N_ELEMENTS (socketex_icalls)},
 	{"System.Object", object_icalls, G_N_ELEMENTS (object_icalls)},
 	{"System.Reflection.Assembly", assembly_icalls, G_N_ELEMENTS (assembly_icalls)},
+	{"System.Reflection.AssemblyName", assembly_name_icalls, G_N_ELEMENTS (assembly_name_icalls)},
 	{"System.Reflection.Emit.AssemblyBuilder", assemblybuilder_icalls, G_N_ELEMENTS (assemblybuilder_icalls)},
 	{"System.Reflection.Emit.CustomAttributeBuilder", customattrbuilder_icalls, G_N_ELEMENTS (customattrbuilder_icalls)},
 	{"System.Reflection.Emit.DynamicMethod", dynamicmethod_icalls, G_N_ELEMENTS (dynamicmethod_icalls)},
_______________________________________________
Mono-devel-list mailing list
Mono-devel-list@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-devel-list

Reply via email to