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
[email protected]
http://lists.ximian.com/mailman/listinfo/mono-devel-list