Просмотр исходного кода

In .:
2007-08-23 Robert Jordan <[email protected]>

* corlib.dll.sources: Added MemberInfoSerializationHolder.cs.

In System.Runtime.Serialization.Formatters.Binary:
2007-08-23 Robert Jordan <[email protected]>

* ObjectReader.cs, ObjectReader.cs: Map between System.MonoType[] and
MS.NET's System.RuntimeType[].

* ObjectReader.cs (ReadType): When a type couldn't be found, emit
a more useful exception.

In System.Reflection:
2007-08-23 Robert Jordan <[email protected]>

* MemberInfoSerializationHolder.cs: created from
ReflectionSerializationHolder to match MS (fixes bug #80761).
Add support for fields, events, properties and generic methods.

* MonoMethod.cs (GetObjectData): handle generic arguments.

* MonoGenericMethod.cs: mark as [Serializable].

* MonoProperty.cs (GetObjectData): implemented.

* MonoField.cs: ditto.

* MonoEvent.cs: ditto.


svn path=/trunk/mcs/; revision=84732

Robert Jordan 18 лет назад
Родитель
Сommit
c76ea13748

+ 4 - 0
mcs/class/corlib/ChangeLog

@@ -1,3 +1,7 @@
+2007-08-23  Robert Jordan  <[email protected]>
+
+	* corlib.dll.sources: Added MemberInfoSerializationHolder.cs.
+
 2007-08-22  Atsushi Enomoto  <[email protected]>
 
 	* corlib_test.dll.sources : added ChannelServicesTest.cs.

+ 16 - 0
mcs/class/corlib/System.Reflection/ChangeLog

@@ -1,3 +1,19 @@
+2007-08-23  Robert Jordan  <[email protected]>
+
+	* MemberInfoSerializationHolder.cs: created from
+	ReflectionSerializationHolder to match MS (fixes bug #80761).
+	Add support for	fields, events, properties and generic methods.
+
+	* MonoMethod.cs (GetObjectData): handle generic arguments.
+
+	* MonoGenericMethod.cs: mark as [Serializable].
+
+	* MonoProperty.cs (GetObjectData): implemented.
+
+	* MonoField.cs: ditto.
+
+	* MonoEvent.cs: ditto.
+
 2007-07-19  Atsushi Enomoto  <[email protected]>
 
 	* MonoMethod.cs : parameter types should be fixed as well.

+ 173 - 0
mcs/class/corlib/System.Reflection/MemberInfoSerializationHolder.cs

@@ -0,0 +1,173 @@
+// MemberInfoSerializationHolder.cs.cs
+//
+// Author:
+//  Patrik Torstensson
+//  Robert Jordan <[email protected]>
+//
+// (C) 2003 Patrik Torstensson
+
+//
+// Copyright (C) 2004-2007 Novell, Inc (http://www.novell.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Runtime.Serialization;
+
+namespace System.Reflection
+{
+	[Serializable]
+	internal class MemberInfoSerializationHolder : IObjectReference, ISerializable
+	{
+		const BindingFlags DefaultBinding = BindingFlags.Instance | BindingFlags.Static |
+			BindingFlags.Public | BindingFlags.NonPublic;
+
+		readonly string		_memberName;
+		readonly string		_memberSignature;
+		readonly MemberTypes	_memberType;
+		readonly Type		_reflectedType;
+#if NET_2_0
+		readonly Type[]          _genericArguments;
+#endif
+		MemberInfoSerializationHolder(SerializationInfo info, StreamingContext ctx)
+		{
+			string assemblyName;
+			string typeName;
+
+			assemblyName = info.GetString("AssemblyName");
+			typeName = info.GetString("ClassName");
+
+			_memberName = info.GetString("Name");
+			_memberSignature = info.GetString("Signature");
+			_memberType = (MemberTypes) info.GetInt32("MemberType");
+
+#if NET_2_0
+			try {
+				_genericArguments = null;
+
+				// FIXME: this doesn't work at present. It seems that
+				// ObjectManager doesn't cope with nested IObjectReferences.
+				// _genericArguments = (Type[]) info.GetValue("GenericArguments", typeof(Type[]));
+			} catch (SerializationException) {
+				// expected (old NET_1_0 protocol)
+			}
+#endif
+			// Load type
+			Assembly asm = Assembly.Load(assemblyName);
+
+			_reflectedType = asm.GetType(typeName, true, true);
+		}
+
+		public static void Serialize(SerializationInfo info, String name, Type klass, String signature, MemberTypes type)
+		{
+			Serialize (info, name, klass, signature, type, null);
+		}
+
+#if NET_2_0
+		public
+#endif
+		static void Serialize(SerializationInfo info, String name, Type klass, String signature, MemberTypes type, Type[] genericArguments)
+		{
+			info.SetType( typeof(MemberInfoSerializationHolder));
+
+			info.AddValue("AssemblyName", klass.Module.Assembly.FullName, typeof(String));
+			info.AddValue("ClassName", klass.FullName, typeof(String));
+
+			info.AddValue("Name", name, typeof(String));
+			info.AddValue("Signature", signature, typeof(String));
+			info.AddValue("MemberType",(int)type);
+#if NET_2_0
+			info.AddValue("GenericArguments", genericArguments, typeof (Type[]));
+#endif
+		}
+
+		public void GetObjectData(SerializationInfo info, StreamingContext context)
+		{
+			throw new NotSupportedException();
+		}
+
+		public object GetRealObject(StreamingContext context)
+		{
+			switch (_memberType) 
+			{
+				case MemberTypes.Constructor:
+					ConstructorInfo [] ctors;
+
+					ctors = _reflectedType.GetConstructors (DefaultBinding);
+					for (int i = 0; i < ctors.Length; i++) 
+						if ( ctors[i].ToString().Equals(_memberSignature)) 
+							return ctors[i];
+
+					throw new SerializationException (String.Format ("Could not find constructor '{0}' in type '{1}'", _memberSignature, _reflectedType));
+
+				case MemberTypes.Method:
+					MethodInfo [] methods;
+
+					methods = _reflectedType.GetMethods(DefaultBinding);
+					for (int i = 0; i < methods.Length; i++) 
+						if ((methods[i]).ToString().Equals(_memberSignature)) 
+							return methods[i];
+#if NET_2_0
+						else if (_genericArguments != null &&
+							methods[i].IsGenericMethod &&
+							methods[i].GetGenericArguments().Length == _genericArguments.Length) {
+
+							MethodInfo mi = methods[i].MakeGenericMethod(_genericArguments);
+
+							if (mi.ToString() == _memberSignature)
+								return mi;
+						}
+#endif
+
+					throw new SerializationException (String.Format ("Could not find method '{0}' in type '{1}'", _memberSignature, _reflectedType));
+
+				case MemberTypes.Field:
+					FieldInfo fi = _reflectedType.GetField (_memberName, DefaultBinding);
+
+					if (fi != null)
+						return fi;
+
+					throw new SerializationException (String.Format ("Could not find field '{0}' in type '{1}'", _memberName, _reflectedType));
+
+				case MemberTypes.Property:
+					PropertyInfo pi = _reflectedType.GetProperty (_memberName, DefaultBinding);
+
+					if (pi != null)
+						return pi;
+
+					throw new SerializationException (String.Format ("Could not find property '{0}' in type '{1}'", _memberName, _reflectedType));
+
+#if NET_2_0
+				case MemberTypes.Event:
+					EventInfo ei = _reflectedType.GetEvent (_memberName, DefaultBinding);
+
+					if (ei != null)
+						return ei;
+
+					throw new SerializationException (String.Format ("Could not find event '{0}' in type '{1}'", _memberName, _reflectedType));
+#endif
+
+				default:
+					throw new SerializationException (String.Format ("Unhandled MemberType {0}",  _memberType));
+			}
+		}
+	}
+}

+ 16 - 1
mcs/class/corlib/System.Reflection/MonoEvent.cs

@@ -34,6 +34,7 @@ using System;
 using System.Reflection;
 using System.Runtime.CompilerServices;
 using System.Runtime.InteropServices;
+using System.Runtime.Serialization;
 
 namespace System.Reflection {
 
@@ -51,7 +52,13 @@ namespace System.Reflection {
 		internal static extern void get_event_info (MonoEvent ev, out MonoEventInfo info);
 	}
 
-	internal sealed class MonoEvent: EventInfo {
+#if NET_2_0
+	[Serializable]
+	internal sealed class MonoEvent: EventInfo, ISerializable
+#else
+	internal sealed class MonoEvent: EventInfo
+#endif
+	{
 		IntPtr klass;
 		IntPtr handle;
 
@@ -163,5 +170,13 @@ namespace System.Reflection {
 			return MonoCustomAttrs.GetCustomAttributes (this, attributeType, inherit);
 		}
 
+#if NET_2_0
+		// ISerializable
+		public void GetObjectData (SerializationInfo info, StreamingContext context) 
+		{
+			MemberInfoSerializationHolder.Serialize (info, Name, ReflectedType,
+				ToString(), MemberTypes.Event);
+		}
+#endif
 	}
 }

+ 11 - 2
mcs/class/corlib/System.Reflection/MonoField.cs

@@ -36,10 +36,12 @@ using System;
 using System.Globalization;
 using System.Runtime.CompilerServices;
 using System.Runtime.InteropServices;
+using System.Runtime.Serialization;
 
 namespace System.Reflection {
-	
-	internal class MonoField : FieldInfo {
+
+	[Serializable]
+	internal class MonoField : FieldInfo, ISerializable {
 		internal IntPtr klass;
 		internal RuntimeFieldHandle fhandle;
 		string name;
@@ -141,5 +143,12 @@ namespace System.Reflection {
 			field.fhandle = fhandle;
 			return field;
 		}
+
+		// ISerializable
+		public void GetObjectData (SerializationInfo info, StreamingContext context) 
+		{
+			MemberInfoSerializationHolder.Serialize (info, Name, ReflectedType,
+				ToString(), MemberTypes.Field);
+		}
 	}
 }

+ 2 - 0
mcs/class/corlib/System.Reflection/MonoGenericMethod.cs

@@ -35,6 +35,7 @@ using System.Runtime.CompilerServices;
 
 namespace System.Reflection
 {
+	[Serializable]
 	internal class MonoGenericMethod : MonoMethod
 	{
 		internal MonoGenericMethod ()
@@ -49,6 +50,7 @@ namespace System.Reflection
 		}
 	}
 
+	[Serializable]
 	internal class MonoGenericCMethod : MonoCMethod
 	{
 		internal MonoGenericCMethod ()

+ 8 - 2
mcs/class/corlib/System.Reflection/MonoMethod.cs

@@ -282,7 +282,13 @@ namespace System.Reflection {
 		// ISerializable
 		public void GetObjectData(SerializationInfo info, StreamingContext context) 
 		{
-			ReflectionSerializationHolder.Serialize ( info, Name, ReflectedType, ToString(), MemberTypes.Method);
+#if NET_2_0
+			Type[] genericArguments = IsGenericMethod && !IsGenericMethodDefinition
+				? GetGenericArguments () : null;
+			MemberInfoSerializationHolder.Serialize ( info, Name, ReflectedType, ToString(), MemberTypes.Method, genericArguments);
+#else
+			MemberInfoSerializationHolder.Serialize ( info, Name, ReflectedType, ToString(), MemberTypes.Method);
+#endif
 		}
 
 #if NET_2_0 || BOOTSTRAP_NET_2_0
@@ -469,7 +475,7 @@ namespace System.Reflection {
 		// ISerializable
 		public void GetObjectData(SerializationInfo info, StreamingContext context) 
 		{
-			ReflectionSerializationHolder.Serialize ( info, Name, ReflectedType, ToString(), MemberTypes.Constructor);
+			MemberInfoSerializationHolder.Serialize ( info, Name, ReflectedType, ToString(), MemberTypes.Constructor);
 		}
 	}
 }

+ 10 - 2
mcs/class/corlib/System.Reflection/MonoProperty.cs

@@ -32,6 +32,7 @@
 using System.Globalization;
 using System.Runtime.CompilerServices;
 using System.Runtime.InteropServices;
+using System.Runtime.Serialization;
 using System.Security;
 
 namespace System.Reflection {
@@ -62,7 +63,9 @@ namespace System.Reflection {
 		Name = 1 << 5
 		
 	}
-	internal class MonoProperty : PropertyInfo {
+
+	[Serializable]
+	internal class MonoProperty : PropertyInfo, ISerializable {
 		internal IntPtr klass;
 		internal IntPtr prop;
 		MonoPropertyInfo info;
@@ -267,6 +270,11 @@ namespace System.Reflection {
 		}
 #endif
 
+		// ISerializable
+		public void GetObjectData (SerializationInfo info, StreamingContext context) 
+		{
+			MemberInfoSerializationHolder.Serialize (info, Name, ReflectedType,
+				ToString(), MemberTypes.Property);
+		}
 	}
 }
-

+ 4 - 1
mcs/class/corlib/System.Reflection/ReflectionSerializationHolder.cs

@@ -1,4 +1,7 @@
-// ReflectionSerializationHolder.cs.cs
+// ReflectionSerializationHolder.cs
+//
+// Note: this class was superseded by MemberInfoSerializationHolder but
+// it's still included in the build to provide backwards compatibility.
 //
 // Author:
 //  Patrik Torstensson

+ 8 - 0
mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ChangeLog

@@ -1,3 +1,11 @@
+2007-08-23  Robert Jordan  <[email protected]>
+
+	* ObjectReader.cs, ObjectReader.cs: Map between System.MonoType[] and
+	MS.NET's System.RuntimeType[].
+	
+	* ObjectReader.cs (ReadType): When a type couldn't be found, emit
+	a more useful exception.
+
 2007-05-03  Dick Porter  <[email protected]>
 
 	* BinaryFormatter.cs: Update to 2.0 profile

+ 8 - 2
mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs

@@ -834,9 +834,15 @@ namespace System.Runtime.Serialization.Formatters.Binary
 					// map MS.NET's System.RuntimeType to System.MonoType
 					if (_context.State == StreamingContextStates.Remoting)
 						if (name == "System.RuntimeType")
-							name = "System.MonoType";
+							return typeof (MonoType);
+						else if (name == "System.RuntimeType[]")
+							return typeof (MonoType[]);
 #endif
-					return Type.GetType (name, true);
+					Type t = Type.GetType (name);
+					if (t != null)
+						return t;
+
+					throw new SerializationException (String.Format ("Could not find type '{0}'.", name));
 				}
 
 				case TypeTag.GenericType:

+ 2 - 0
mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectWriter.cs

@@ -958,6 +958,8 @@ namespace System.Runtime.Serialization.Formatters.Binary
 					if (_context.State == StreamingContextStates.Remoting)
 						if (type == typeof (System.MonoType))
 							fullName =  "System.RuntimeType";
+						else if (type == typeof (System.MonoType[]))
+							fullName =  "System.RuntimeType[]";
 #endif
 					writer.Write (fullName);
 					break;

+ 1 - 0
mcs/class/corlib/corlib.dll.sources

@@ -454,6 +454,7 @@ System.Reflection/LocalVariableInfo.cs
 System.Reflection/ManifestResourceInfo.cs
 System.Reflection/MemberFilter.cs
 System.Reflection/MemberInfo.cs
+System.Reflection/MemberInfoSerializationHolder.cs
 System.Reflection/MemberTypes.cs
 System.Reflection/MethodAttributes.cs
 System.Reflection/MethodBase.cs