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