Merge pull request #487 from mayerwin/patch-1
[mono.git] / mcs / class / corlib / System.Runtime.InteropServices / Marshal.cs
index 8605719ea9b26114d9b624bd5acf2dc56470b6c3..4cfb7c2b5ebe0b0e7beab6047b350981997e03d5 100644 (file)
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
-using Mono.Interop;
 using System.Collections;
+using System.Collections.Generic;
 using System.Runtime.CompilerServices;
 using System;
 using System.Security;
 using System.Reflection;
 using System.Threading;
 
-#if NET_2_0
 using System.Runtime.ConstrainedExecution;
+#if !MOONLIGHT
+#if !FULL_AOT_RUNTIME
 using System.Runtime.InteropServices.ComTypes;
+using Mono.Interop;
+#endif
 #endif
 
 namespace System.Runtime.InteropServices
 {
-       [SuppressUnmanagedCodeSecurity ()]
-       public
-#if NET_2_0
-       static
-#else
-       sealed
-#endif
-       class Marshal
+       public static class Marshal
        {
                /* fields */
                public static readonly int SystemMaxDBCSCharSize = 2; // don't know what this is
-               public static readonly int SystemDefaultCharSize;
-
-               static Marshal ()
-               {
-                       SystemDefaultCharSize = Environment.OSVersion.Platform == PlatformID.Win32NT ? 2 : 1;
-               }
-
-#if !NET_2_0
-               private Marshal () {}
-#endif
+               public static readonly int SystemDefaultCharSize = Environment.OSVersion.Platform == PlatformID.Win32NT ? 2 : 1;
 
+#if !MOBILE
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
                private extern static int AddRefInternal (IntPtr pUnk);
+#endif
 
                public static int AddRef (IntPtr pUnk)
                {
+#if !MOBILE
                        if (pUnk == IntPtr.Zero)
                                throw new ArgumentException ("Value cannot be null.", "pUnk");
                        return AddRefInternal (pUnk);
+#else
+                       throw new NotImplementedException ();
+#endif
                }
 
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
                public extern static IntPtr AllocCoTaskMem (int cb);
 
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
-#if NET_2_0
                [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.MayFail)]
-#endif
                public extern static IntPtr AllocHGlobal (IntPtr cb);
 
-#if NET_2_0
                [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.MayFail)]
-#endif
                public static IntPtr AllocHGlobal (int cb)
                {
                        return AllocHGlobal ((IntPtr)cb);
@@ -107,12 +96,12 @@ namespace System.Runtime.InteropServices
                }
 
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               extern static void copy_to_unmanaged (Array source, int startIndex,
-                                                     IntPtr destination, int length);
+               internal extern static void copy_to_unmanaged (Array source, int startIndex,
+                                                              IntPtr destination, int length);
 
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               extern static void copy_from_unmanaged (IntPtr source, int startIndex,
-                                                       Array destination, int length);
+               internal extern static void copy_from_unmanaged (IntPtr source, int startIndex,
+                                                                Array destination, int length);
 
                public static void Copy (byte[] source, int startIndex, IntPtr destination, int length)
                {
@@ -149,12 +138,10 @@ namespace System.Runtime.InteropServices
                        copy_to_unmanaged (source, startIndex, destination, length);
                }
 
-#if NET_2_0
                public static void Copy (IntPtr[] source, int startIndex, IntPtr destination, int length)
                {
                        copy_to_unmanaged (source, startIndex, destination, length);
                }
-#endif
 
                public static void Copy (IntPtr source, byte[] destination, int startIndex, int length)
                {
@@ -191,7 +178,6 @@ namespace System.Runtime.InteropServices
                        copy_from_unmanaged (source, startIndex, destination, length);
                }
 
-#if NET_2_0
                public static void Copy (IntPtr source, IntPtr[] destination, int startIndex, int length)
                {
                        copy_from_unmanaged (source, startIndex, destination, length);
@@ -202,8 +188,8 @@ namespace System.Runtime.InteropServices
                {
                        throw new NotImplementedException ();
                }
-#endif
-               
+
+#if !FULL_AOT_RUNTIME && !MOONLIGHT
                public static object CreateWrapperOfType (object o, Type t)
                {
                        __ComObject co = o as __ComObject;
@@ -220,11 +206,10 @@ namespace System.Runtime.InteropServices
 
                        return ComInteropProxy.GetProxy (co.IUnknown, t).GetTransparentProxy ();
                }
+#endif
 
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
-#if NET_2_0
                [ComVisible (true)]
-#endif
                public extern static void DestroyStructure (IntPtr ptr, Type structuretype);
 
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
@@ -234,13 +219,9 @@ namespace System.Runtime.InteropServices
                public extern static void FreeCoTaskMem (IntPtr ptr);
 
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
-#if NET_2_0
                [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-#endif
                public extern static void FreeHGlobal (IntPtr hglobal);
 
-#if NET_2_0
-
                static void ClearBSTR (IntPtr ptr)
                {
                        int len = ReadInt32 (ptr, -4);
@@ -249,10 +230,10 @@ namespace System.Runtime.InteropServices
                                WriteByte (ptr, i, 0);
                }
                
-               public static void ZeroFreeBSTR (IntPtr ptr)
+               public static void ZeroFreeBSTR (IntPtr s)
                {
-                       ClearBSTR (ptr);
-                       FreeBSTR (ptr);
+                       ClearBSTR (s);
+                       FreeBSTR (s);
                }
 
                static void ClearAnsi (IntPtr ptr)
@@ -267,41 +248,57 @@ namespace System.Runtime.InteropServices
                                WriteInt16 (ptr, i, 0);
                }
                
-               public static void ZeroFreeCoTaskMemAnsi (IntPtr ptr)
+               public static void ZeroFreeCoTaskMemAnsi (IntPtr s)
                {
-                       ClearAnsi (ptr);
-                       FreeCoTaskMem (ptr);
+                       ClearAnsi (s);
+                       FreeCoTaskMem (s);
                }
 
-               public static void ZeroFreeCoTaskMemUnicode (IntPtr ptr)
+               public static void ZeroFreeCoTaskMemUnicode (IntPtr s)
                {
-                       ClearUnicode (ptr);
-                       FreeCoTaskMem (ptr);
+                       ClearUnicode (s);
+                       FreeCoTaskMem (s);
                }
 
-               public static void ZeroFreeGlobalAllocAnsi (IntPtr hglobal)
+               public static void ZeroFreeGlobalAllocAnsi (IntPtr s)
                {
-                       ClearAnsi (hglobal);
-                       FreeHGlobal (hglobal);
+                       ClearAnsi (s);
+                       FreeHGlobal (s);
                }
 
-               public static void ZeroFreeGlobalAllocUnicode (IntPtr hglobal)
+               public static void ZeroFreeGlobalAllocUnicode (IntPtr s)
                {
-                       ClearUnicode (hglobal);
-                       FreeHGlobal (hglobal);
+                       ClearUnicode (s);
+                       FreeHGlobal (s);
                }
-#endif
 
-               [MonoTODO]
+#if !FULL_AOT_RUNTIME && !MOONLIGHT
                public static Guid GenerateGuidForType (Type type)
                {
-                       throw new NotImplementedException ();
+                       return type.GUID;
                }
 
-               [MonoTODO]
                public static string GenerateProgIdForType (Type type)
                {
-                       throw new NotImplementedException ();
+                       IList<CustomAttributeData> attrs = CustomAttributeData.GetCustomAttributes (type);
+
+                       foreach (var a in attrs)
+                       {
+                               var dt = a.Constructor.DeclaringType;
+                               string name = dt.Name;
+                               if (name == "ProgIdAttribute")
+                               {
+                                       var args = a.ConstructorArguments;
+                                       string text = a.ConstructorArguments[0].Value as string;
+                                       if (text == null)
+                                       {
+                                               text = string.Empty;
+                                       }
+                                       return text;
+                               }
+                       }
+
+                       return type.FullName;
                }
 
                [MonoTODO]
@@ -310,6 +307,7 @@ namespace System.Runtime.InteropServices
                        throw new NotImplementedException ();
                }
 
+#if !MOBILE
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
                private extern static IntPtr GetCCW (object o, Type T);
 
@@ -320,21 +318,24 @@ namespace System.Runtime.InteropServices
                        else
                                return GetCCW (o, T);
                }
+#endif
 
                public static IntPtr GetComInterfaceForObject (object o, Type T)
                {
+#if !MOBILE
                        IntPtr pItf = GetComInterfaceForObjectInternal (o, T);
                        AddRef (pItf);
                        return pItf;
+#else
+                       throw new NotImplementedException ();
+#endif
                }
 
-#if NET_2_0
                [MonoTODO]
                public static IntPtr GetComInterfaceForObjectInContext (object o, Type t)
                {
                        throw new NotImplementedException ();
                }
-#endif
 
                [MonoNotSupportedAttribute ("MSDN states user code should never need to call this method.")]
                public static object GetComObjectData (object obj, object key)
@@ -342,18 +343,24 @@ namespace System.Runtime.InteropServices
                        throw new NotSupportedException ("MSDN states user code should never need to call this method.");
                }
 
+#if !MOBILE
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
                private extern static int GetComSlotForMethodInfoInternal (MemberInfo m);
+#endif
 
                public static int GetComSlotForMethodInfo (MemberInfo m)
                {
+#if !MOBILE
                        if (m == null)
-                               throw new ArgumentNullException("m", "Value cannot be null.");
+                               throw new ArgumentNullException ("m");
                        if (!(m is MethodInfo))
-                               throw new ArgumentException("m", "The MemberInfo must be an interface method.");
+                               throw new ArgumentException ("The MemberInfo must be an interface method.", "m");
                        if (!m.DeclaringType.IsInterface)
-                               throw new ArgumentException("m", "The MemberInfo must be an interface method.");
+                               throw new ArgumentException ("The MemberInfo must be an interface method.", "m");
                        return GetComSlotForMethodInfoInternal (m);
+#else
+                       throw new NotImplementedException ();
+#endif
                }
 
                [MonoTODO]
@@ -369,20 +376,22 @@ namespace System.Runtime.InteropServices
                }
 
                [MonoTODO]
-#if NET_2_0
                [ComVisible (true)]
-#endif
                public static IntPtr GetExceptionPointers()
                {
                        throw new NotImplementedException ();
                }
 
-               [MonoTODO]
                public static IntPtr GetHINSTANCE (Module m)
                {
-                       throw new NotImplementedException ();
+                       if (m == null)
+                               throw new ArgumentNullException ("m");
+
+                       return m.GetHINSTANCE ();
                }
+#endif // !MOONLIGHT
 
+#if !FULL_AOT_RUNTIME
                [MonoTODO ("SetErrorInfo")]
                public static int GetHRForException (Exception e)
                {
@@ -390,14 +399,12 @@ namespace System.Runtime.InteropServices
                }
 
                [MonoTODO]
-#if NET_2_0
                [ReliabilityContract (Consistency.WillNotCorruptState, Cer.Success)]
-#endif
                public static int GetHRForLastWin32Error()
                {
                        throw new NotImplementedException ();
                }
-
+#if !MOONLIGHT
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
                private extern static IntPtr GetIDispatchForObjectInternal (object o);
 
@@ -409,13 +416,11 @@ namespace System.Runtime.InteropServices
                        return pUnk;
                }
 
-#if NET_2_0
                [MonoTODO]
                public static IntPtr GetIDispatchForObjectInContext (object o)
                {
                        throw new NotImplementedException ();
                }
-#endif
 
                [MonoTODO]
                public static IntPtr GetITypeInfoForType (Type t)
@@ -434,24 +439,14 @@ namespace System.Runtime.InteropServices
                        return pUnk;
                }
 
-#if NET_2_0
                [MonoTODO]
                public static IntPtr GetIUnknownForObjectInContext (object o)
                {
                        throw new NotImplementedException ();
                }
-#endif
-
-               [MethodImplAttribute(MethodImplOptions.InternalCall)]
-#if NET_2_0
-               [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-#endif
-               public static extern int GetLastWin32Error();
 
                [MonoTODO]
-#if NET_2_0
                [Obsolete ("This method has been deprecated")]
-#endif
                public static IntPtr GetManagedThunkForUnmanagedMethodPtr (IntPtr pfnMethodToWrap, IntPtr pbSignature, int cbSignature)
                {
                        throw new NotImplementedException ();
@@ -470,11 +465,14 @@ namespace System.Runtime.InteropServices
                        Marshal.StructureToPtr(vt, pDstNativeVariant, false);
                }
 
+#if !MOBILE
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
                private static extern object GetObjectForCCW (IntPtr pUnk);
+#endif
 
                public static object GetObjectForIUnknown (IntPtr pUnk)
                {
+#if !MOBILE
                        object obj = GetObjectForCCW (pUnk);
                        // was not a CCW
                        if (obj == null) {
@@ -482,6 +480,9 @@ namespace System.Runtime.InteropServices
                                obj = proxy.GetTransparentProxy ();
                        }
                        return obj;
+#else
+                       throw new NotImplementedException ();
+#endif
                }
 
                public static object GetObjectForNativeVariant (IntPtr pSrcNativeVariant)
@@ -508,9 +509,7 @@ namespace System.Runtime.InteropServices
                }
 
                [MonoTODO]
-#if NET_2_0
                [Obsolete ("This method has been deprecated")]
-#endif
                public static Thread GetThreadFromFiberCookie (int cookie)
                {
                        throw new NotImplementedException ();
@@ -535,38 +534,31 @@ namespace System.Runtime.InteropServices
                        throw new NotImplementedException ();
                }
 
-#if NET_2_0
+#if !FULL_AOT_RUNTIME
                [Obsolete]
-#endif
                [MonoTODO]
                public static string GetTypeInfoName (UCOMITypeInfo pTI)
                {
                        throw new NotImplementedException ();
                }
 
-#if NET_2_0
                public static string GetTypeInfoName (ITypeInfo typeInfo)
                {
                        throw new NotImplementedException ();
                }
-#endif
 
-#if NET_2_0
                [Obsolete]
-#endif
                [MonoTODO]
                public static Guid GetTypeLibGuid (UCOMITypeLib pTLB)
                {
                        throw new NotImplementedException ();
                }
 
-#if NET_2_0
                [MonoTODO]
                public static Guid GetTypeLibGuid (ITypeLib typelib)
                {
                        throw new NotImplementedException ();
                }
-#endif
 
                [MonoTODO]
                public static Guid GetTypeLibGuidForAssembly (Assembly asm)
@@ -574,33 +566,26 @@ namespace System.Runtime.InteropServices
                        throw new NotImplementedException ();
                }
 
-#if NET_2_0
                [Obsolete]
-#endif
                [MonoTODO]
                public static int GetTypeLibLcid (UCOMITypeLib pTLB)
                {
                        throw new NotImplementedException ();
                }
 
-#if NET_2_0
                [MonoTODO]
                public static int GetTypeLibLcid (ITypeLib typelib)
                {
                        throw new NotImplementedException ();
                }
-#endif
 
-#if NET_2_0
                [Obsolete]
-#endif
                [MonoTODO]
                public static string GetTypeLibName (UCOMITypeLib pTLB)
                {
                        throw new NotImplementedException ();
                }
 
-#if NET_2_0
                [MonoTODO]
                public static string GetTypeLibName (ITypeLib typelib)
                {
@@ -620,16 +605,21 @@ namespace System.Runtime.InteropServices
 #endif
 
                [MonoTODO]
-#if NET_2_0
                [Obsolete ("This method has been deprecated")]
-#endif
                public static IntPtr GetUnmanagedThunkForManagedMethodPtr (IntPtr pfnMethodToWrap, IntPtr pbSignature, int cbSignature)
                {
                        throw new NotImplementedException ();
                }
 
+#if !MOBILE
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
                public extern static bool IsComObject (object o);
+#else
+               public static bool IsComObject (object o)
+               {
+                       throw new NotImplementedException ();
+               }
+#endif         
 
                [MonoTODO]
                public static bool IsTypeVisibleFromCom (Type t)
@@ -642,6 +632,12 @@ namespace System.Runtime.InteropServices
                {
                        throw new NotImplementedException ();
                }
+#endif // !NET_2_1
+#endif
+
+               [MethodImplAttribute(MethodImplOptions.InternalCall)]
+               [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
+               public static extern int GetLastWin32Error();
 
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
                public extern static IntPtr OffsetOf (Type t, string fieldName);
@@ -676,29 +672,38 @@ namespace System.Runtime.InteropServices
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
                public extern static string PtrToStringUni (IntPtr ptr, int len);
 
+#if !MOBILE
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
                public extern static string PtrToStringBSTR (IntPtr ptr);
+#else
+               public static string PtrToStringBSTR (IntPtr ptr)
+               {
+                       throw new NotImplementedException ();
+               }
+#endif
                
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
-#if NET_2_0
                [ComVisible (true)]
-#endif
                public extern static void PtrToStructure (IntPtr ptr, object structure);
 
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
-#if NET_2_0
                [ComVisible (true)]
-#endif
                public extern static object PtrToStructure (IntPtr ptr, Type structureType);
 
+#if !MOBILE
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
                private extern static int QueryInterfaceInternal (IntPtr pUnk, ref Guid iid, out IntPtr ppv);
+#endif
 
                public static int QueryInterface (IntPtr pUnk, ref Guid iid, out IntPtr ppv)
                {
+#if !MOBILE
                        if (pUnk == IntPtr.Zero)
                                throw new ArgumentException ("Value cannot be null.", "pUnk");
                        return QueryInterfaceInternal (pUnk, ref iid, out ppv);
+#else
+                       throw new NotImplementedException ();
+#endif
                }
 
                public static byte ReadByte (IntPtr ptr)
@@ -710,6 +715,7 @@ namespace System.Runtime.InteropServices
                public extern static byte ReadByte (IntPtr ptr, int ofs);
 
                [MonoTODO]
+               [SuppressUnmanagedCodeSecurity]
                public static byte ReadByte ([In, MarshalAs (UnmanagedType.AsAny)] object ptr, int ofs)
                {
                        throw new NotImplementedException ();
@@ -724,74 +730,58 @@ namespace System.Runtime.InteropServices
                public extern static short ReadInt16 (IntPtr ptr, int ofs);
 
                [MonoTODO]
+               [SuppressUnmanagedCodeSecurity]
                public static short ReadInt16 ([In, MarshalAs(UnmanagedType.AsAny)] object ptr, int ofs)
                {
                        throw new NotImplementedException ();
                }
 
-#if NET_2_0
                [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-#endif
                public static int ReadInt32 (IntPtr ptr)
                {
                        return ReadInt32 (ptr, 0);
                }
 
-#if NET_2_0
                [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-#endif
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
                public extern static int ReadInt32 (IntPtr ptr, int ofs);
 
-#if NET_2_0
                [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-#endif
                [MonoTODO]
+               [SuppressUnmanagedCodeSecurity]
                public static int ReadInt32 ([In, MarshalAs(UnmanagedType.AsAny)] object ptr, int ofs)
                {
                        throw new NotImplementedException ();
                }
 
-#if NET_2_0
                [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-#endif
                public static long ReadInt64 (IntPtr ptr)
                {
                        return ReadInt64 (ptr, 0);
                }
 
-#if NET_2_0
-               [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-#endif
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
                public extern static long ReadInt64 (IntPtr ptr, int ofs);
 
-#if NET_2_0
                [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-#endif
                [MonoTODO]
+               [SuppressUnmanagedCodeSecurity]
                public static long ReadInt64 ([In, MarshalAs (UnmanagedType.AsAny)] object ptr, int ofs)
                {
                        throw new NotImplementedException ();
                }
 
-#if NET_2_0
                [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-#endif
                public static IntPtr ReadIntPtr (IntPtr ptr)
                {
                        return ReadIntPtr (ptr, 0);
                }
                
-#if NET_2_0
                [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-#endif
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
                public extern static IntPtr ReadIntPtr (IntPtr ptr, int ofs);
 
-#if NET_2_0
                [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-#endif
                [MonoTODO]
                public static IntPtr ReadIntPtr ([In, MarshalAs (UnmanagedType.AsAny)] object ptr, int ofs)
                {
@@ -804,22 +794,27 @@ namespace System.Runtime.InteropServices
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
                public extern static IntPtr ReAllocHGlobal (IntPtr pv, IntPtr cb);
 
-#if NET_2_0
+#if !MOBILE
                [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-#endif
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
                private extern static int ReleaseInternal (IntPtr pUnk);
+#endif
 
-#if NET_2_0
                [ReliabilityContract (Consistency.WillNotCorruptState, Cer.Success)]
-#endif
                public static int Release (IntPtr pUnk)
                {
+#if !MOBILE
                        if (pUnk == IntPtr.Zero)
                                throw new ArgumentException ("Value cannot be null.", "pUnk");
+
                        return ReleaseInternal (pUnk);
+#else
+                       throw new NotImplementedException ();
+#endif
                }
 
+#if !FULL_AOT_RUNTIME
+#if !MOONLIGHT
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
                private extern static int ReleaseComObjectInternal (object co);
 
@@ -832,9 +827,7 @@ namespace System.Runtime.InteropServices
                        return ReleaseComObjectInternal (o);
                }
 
-#if NET_2_0
                [Obsolete]
-#endif
                [MonoTODO]
                public static void ReleaseThreadCache()
                {
@@ -846,10 +839,10 @@ namespace System.Runtime.InteropServices
                {
                        throw new NotSupportedException ("MSDN states user code should never need to call this method.");
                }
+#endif // !NET_2_1
+#endif
 
-#if NET_2_0
                [ComVisible (true)]
-#endif
                public static int SizeOf (object structure)
                {
                        return SizeOf (structure.GetType ());
@@ -911,7 +904,7 @@ namespace System.Runtime.InteropServices
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
                public extern static IntPtr StringToHGlobalUni (string s);
 
-#if NET_2_0
+#if !MOONLIGHT
                public static IntPtr SecureStringToBSTR (SecureString s)
                {
                        if (s == null)
@@ -1001,23 +994,21 @@ namespace System.Runtime.InteropServices
                }
 #endif
 
-#if NET_2_0
                [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.MayFail)]
                [ComVisible (true)]
-#endif
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
                public extern static void StructureToPtr (object structure, IntPtr ptr, bool fDeleteOld);
 
-               public static void ThrowExceptionForHR (int errorCode)
-               {
-                       if (errorCode < 0)
-                               throw new COMException ("", errorCode);
+               public static void ThrowExceptionForHR (int errorCode) {
+                       Exception ex = GetExceptionForHR (errorCode);
+                       if (ex != null)
+                               throw ex;
                }
 
-               [MonoTODO]
-               public static void ThrowExceptionForHR (int errorCode, IntPtr errorInfo)
-               {
-                       throw new NotImplementedException ();
+               public static void ThrowExceptionForHR (int errorCode, IntPtr errorInfo) {
+                       Exception ex = GetExceptionForHR (errorCode, errorInfo);
+                       if (ex != null)
+                               throw ex;
                }
 
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
@@ -1032,6 +1023,7 @@ namespace System.Runtime.InteropServices
                public extern static void WriteByte (IntPtr ptr, int ofs, byte val);
 
                [MonoTODO]
+               [SuppressUnmanagedCodeSecurity]
                public static void WriteByte ([In, Out, MarshalAs (UnmanagedType.AsAny)] object ptr, int ofs, byte val)
                {
                        throw new NotImplementedException ();
@@ -1046,6 +1038,7 @@ namespace System.Runtime.InteropServices
                public extern static void WriteInt16 (IntPtr ptr, int ofs, short val);
 
                [MonoTODO]
+               [SuppressUnmanagedCodeSecurity]
                public static void WriteInt16 ([In, Out, MarshalAs (UnmanagedType.AsAny)] object ptr, int ofs, short val)
                {
                        throw new NotImplementedException ();
@@ -1075,6 +1068,7 @@ namespace System.Runtime.InteropServices
                public extern static void WriteInt32 (IntPtr ptr, int ofs, int val);
 
                [MonoTODO]
+               [SuppressUnmanagedCodeSecurity]
                public static void WriteInt32([In, Out, MarshalAs(UnmanagedType.AsAny)] object ptr, int ofs, int val)
                {
                        throw new NotImplementedException ();
@@ -1089,6 +1083,7 @@ namespace System.Runtime.InteropServices
                public extern static void WriteInt64 (IntPtr ptr, int ofs, long val);
 
                [MonoTODO]
+               [SuppressUnmanagedCodeSecurity]
                public static void WriteInt64 ([In, Out, MarshalAs (UnmanagedType.AsAny)] object ptr, int ofs, long val)
                {
                        throw new NotImplementedException ();
@@ -1108,32 +1103,48 @@ namespace System.Runtime.InteropServices
                        throw new NotImplementedException ();
                }
 
-#if NET_2_0
-               public static int FinalReleaseComObject (object o)
-               {
-                       while (ReleaseComObject (o) != 0);
-                       return 0;
+               public static Exception GetExceptionForHR (int errorCode) {
+                       return GetExceptionForHR (errorCode, IntPtr.Zero);
                }
 
-               [MonoTODO]
-               public static Exception GetExceptionForHR (int errorCode)
-               {
-                       throw new NotImplementedException ();
+               public static Exception GetExceptionForHR (int errorCode, IntPtr errorInfo) {
+
+                       const int E_OUTOFMEMORY = unchecked ((int)0x8007000EL);
+                       const int E_INVALIDARG = unchecked ((int)0X80070057);
+                       
+                       switch (errorCode)
+                       {
+                       case E_OUTOFMEMORY:
+                               return new OutOfMemoryException ();
+                       case E_INVALIDARG:
+                               return new ArgumentException ();
+                       }
+                       if (errorCode < 0)
+                               return new COMException ("", errorCode);
+                       return null;
                }
 
-               [MonoTODO]
-               public static Exception GetExceptionForHR (int errorCode, IntPtr errorInfo)
+#if !FULL_AOT_RUNTIME
+#if !MOONLIGHT
+               public static int FinalReleaseComObject (object o)
                {
-                       throw new NotImplementedException ();
+                       while (ReleaseComObject (o) != 0);
+                       return 0;
                }
+#endif
+#endif
 
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
                private static extern Delegate GetDelegateForFunctionPointerInternal (IntPtr ptr, Type t);
 
                public static Delegate GetDelegateForFunctionPointer (IntPtr ptr, Type t)
                {
+                       if (t == null)
+                               throw new ArgumentNullException ("t");
                        if (!t.IsSubclassOf (typeof (MulticastDelegate)) || (t == typeof (MulticastDelegate)))
                                throw new ArgumentException ("Type is not a delegate", "t");
+                       if (t.IsGenericType)
+                               throw new ArgumentException ("The specified Type must not be a generic type definition.");
                        if (ptr == IntPtr.Zero)
                                throw new ArgumentNullException ("ptr");
 
@@ -1150,6 +1161,5 @@ namespace System.Runtime.InteropServices
                        
                        return GetFunctionPointerForDelegateInternal (d);
                }
-#endif
        }
 }