using System.Runtime.Serialization;
using System.Runtime.InteropServices;
-
-#if NET_2_0
using System.Runtime.ConstrainedExecution;
-#endif
+using System.Threading;
+using System.Runtime.CompilerServices;
+using System.Reflection;
+using System.Diagnostics.Contracts;
namespace System
{
-#if NET_2_0
[ComVisible (true)]
-#endif
- [MonoTODO ("Serialization needs tests")]
[Serializable]
public struct RuntimeTypeHandle : ISerializable
{
value = val;
}
+ internal RuntimeTypeHandle (RuntimeType type)
+ : this (type._impl.value)
+ {
+ }
+
RuntimeTypeHandle (SerializationInfo info, StreamingContext context)
{
if (info == null)
throw new ArgumentNullException ("info");
- MonoType mt = ((MonoType) info.GetValue ("TypeObj", typeof (MonoType)));
+ RuntimeType mt = ((RuntimeType) info.GetValue ("TypeObj", typeof (RuntimeType)));
value = mt.TypeHandle.Value;
if (value == IntPtr.Zero)
throw new SerializationException (Locale.GetText ("Insufficient state."));
if (info == null)
throw new ArgumentNullException ("info");
- info.AddValue ("TypeObj", Type.GetTypeHandle (this), typeof (MonoType));
+ if (value == IntPtr.Zero)
+ throw new SerializationException ("Object fields may not be properly initialized");
+
+ info.AddValue ("TypeObj", Type.GetTypeHandle (this), typeof (RuntimeType));
}
-#if NET_2_0
[ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
public override bool Equals (object obj)
{
return value.GetHashCode ();
}
- public static bool operator == (RuntimeTypeHandle left, RuntimeTypeHandle right)
+ public static bool operator == (RuntimeTypeHandle left, Object right)
{
- return left.Equals (right);
+ return (right != null) && (right is RuntimeTypeHandle) && left.Equals ((RuntimeTypeHandle)right);
}
- public static bool operator != (RuntimeTypeHandle left, RuntimeTypeHandle right)
+ public static bool operator != (RuntimeTypeHandle left, Object right)
{
- return !left.Equals (right);
+ return (right == null) || !(right is RuntimeTypeHandle) || !left.Equals ((RuntimeTypeHandle)right);
}
public static bool operator == (Object left, RuntimeTypeHandle right)
return (left == null) || !(left is RuntimeTypeHandle) || !((RuntimeTypeHandle)left).Equals (right);
}
+ [MethodImplAttribute(MethodImplOptions.InternalCall)]
+ internal static extern TypeAttributes GetAttributes (RuntimeType type);
+
[CLSCompliant (false)]
[ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
- public ModuleHandle GetModuleHandle () {
+ public ModuleHandle GetModuleHandle ()
+ {
+ // Although MS' runtime is crashing here, we prefer throwing an exception.
+ // The check is needed because Type.GetTypeFromHandle returns null
+ // for zero handles.
+ if (value == IntPtr.Zero)
+ throw new InvalidOperationException ("Object fields may not be properly initialized");
+
return Type.GetTypeFromHandle (this).Module.ModuleHandle;
}
-#endif
+
+ [MethodImplAttribute(MethodImplOptions.InternalCall)]
+ static extern int GetMetadataToken (RuntimeType type);
+
+ internal static int GetToken (RuntimeType type)
+ {
+ return GetMetadataToken (type);
+ }
+
+ [MethodImplAttribute(MethodImplOptions.InternalCall)]
+ extern static Type GetGenericTypeDefinition_impl (RuntimeType type);
+
+ internal static Type GetGenericTypeDefinition (RuntimeType type)
+ {
+ return GetGenericTypeDefinition_impl (type);
+ }
+
+ internal static bool HasElementType (RuntimeType type)
+ {
+ return IsArray (type) || IsByRef (type) || IsPointer (type);
+ }
+
+ internal static bool HasProxyAttribute (RuntimeType type)
+ {
+ throw new NotImplementedException ("HasProxyAttribute");
+ }
+
+ [MethodImplAttribute(MethodImplOptions.InternalCall)]
+ internal extern static bool HasInstantiation (RuntimeType type);
+
+ [MethodImplAttribute(MethodImplOptions.InternalCall)]
+ internal extern static bool IsArray(RuntimeType type);
+
+ [MethodImplAttribute(MethodImplOptions.InternalCall)]
+ internal extern static bool IsByRef (RuntimeType type);
+
+ [MethodImplAttribute (MethodImplOptions.InternalCall)]
+ internal extern static bool IsComObject (RuntimeType type);
+
+ [MethodImplAttribute(MethodImplOptions.InternalCall)]
+ internal extern static bool IsInstanceOfType (RuntimeType type, Object o);
+
+ [MethodImplAttribute(MethodImplOptions.InternalCall)]
+ internal extern static bool IsPointer (RuntimeType type);
+
+ [MethodImplAttribute(MethodImplOptions.InternalCall)]
+ internal extern static bool IsPrimitive (RuntimeType type);
+
+ internal static bool IsComObject (RuntimeType type, bool isGenericCOM)
+ {
+ return isGenericCOM ? false : IsComObject (type);
+ }
+
+ internal static bool IsContextful (RuntimeType type)
+ {
+ return typeof (ContextBoundObject).IsAssignableFrom (type);
+ }
+
+ internal static bool IsEquivalentTo (RuntimeType rtType1, RuntimeType rtType2)
+ {
+ // refence check is done earlier and we don't recognize anything else
+ return false;
+ }
+
+ internal static bool IsSzArray(RuntimeType type)
+ {
+ // TODO: Better check
+ return IsArray (type) && type.GetArrayRank () == 1;
+ }
+
+ internal static bool IsInterface (RuntimeType type)
+ {
+ return (type.Attributes & TypeAttributes.ClassSemanticsMask) == TypeAttributes.Interface;
+ }
+
+ [MethodImplAttribute(MethodImplOptions.InternalCall)]
+ internal extern static int GetArrayRank(RuntimeType type);
+
+ [MethodImplAttribute(MethodImplOptions.InternalCall)]
+ internal extern static RuntimeAssembly GetAssembly (RuntimeType type);
+
+ [MethodImplAttribute(MethodImplOptions.InternalCall)]
+ internal extern static RuntimeType GetElementType (RuntimeType type);
+
+ [MethodImplAttribute(MethodImplOptions.InternalCall)]
+ internal extern static RuntimeModule GetModule (RuntimeType type);
+
+ [MethodImplAttribute(MethodImplOptions.InternalCall)]
+ internal extern static bool IsGenericVariable (RuntimeType type);
+
+ [MethodImplAttribute(MethodImplOptions.InternalCall)]
+ internal extern static RuntimeType GetBaseType (RuntimeType type);
+
+ internal static bool CanCastTo (RuntimeType type, RuntimeType target)
+ {
+ return type_is_assignable_from (target, type);
+ }
+
+ [MethodImplAttribute(MethodImplOptions.InternalCall)]
+ static extern bool type_is_assignable_from (Type a, Type b);
+
+ [MethodImplAttribute(MethodImplOptions.InternalCall)]
+ internal extern static bool IsGenericTypeDefinition (RuntimeType type);
}
}