2010-05-27 Jb Evain <jbevain@novell.com>
[mcs.git] / class / corlib / System.Runtime.InteropServices / Marshal.cs
blobfa0344c771e185b9b0bf8ce078f780851b8e666d
1 // System.Runtime.InteropServices.Marshal.cs
2 //
3 // Sean MacIsaac (macisaac@ximian.com)
4 // Paolo Molaro (lupus@ximian.com)
5 // Dietmar Maurer (dietmar@ximian.com)
6 // Jonathan Chambers (joncham@gmail.com)
7 //
8 // (C) 2001-2002 Ximian, Inc.
11 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
13 // Permission is hereby granted, free of charge, to any person obtaining
14 // a copy of this software and associated documentation files (the
15 // "Software"), to deal in the Software without restriction, including
16 // without limitation the rights to use, copy, modify, merge, publish,
17 // distribute, sublicense, and/or sell copies of the Software, and to
18 // permit persons to whom the Software is furnished to do so, subject to
19 // the following conditions:
20 //
21 // The above copyright notice and this permission notice shall be
22 // included in all copies or substantial portions of the Software.
23 //
24 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
28 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
29 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
30 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
33 using System.Collections;
34 using System.Runtime.CompilerServices;
35 using System;
36 using System.Security;
37 using System.Reflection;
38 using System.Threading;
40 using System.Runtime.ConstrainedExecution;
41 #if !MOONLIGHT
42 using System.Runtime.InteropServices.ComTypes;
43 #endif
45 #if !MOONLIGHT
46 using Mono.Interop;
47 #endif
49 namespace System.Runtime.InteropServices
51 [SuppressUnmanagedCodeSecurity ()]
52 public static class Marshal
54 /* fields */
55 public static readonly int SystemMaxDBCSCharSize = 2; // don't know what this is
56 public static readonly int SystemDefaultCharSize;
58 static Marshal ()
60 SystemDefaultCharSize = Environment.OSVersion.Platform == PlatformID.Win32NT ? 2 : 1;
63 [MethodImplAttribute (MethodImplOptions.InternalCall)]
64 private extern static int AddRefInternal (IntPtr pUnk);
66 public static int AddRef (IntPtr pUnk)
68 if (pUnk == IntPtr.Zero)
69 throw new ArgumentException ("Value cannot be null.", "pUnk");
70 return AddRefInternal (pUnk);
73 [MethodImplAttribute(MethodImplOptions.InternalCall)]
74 public extern static IntPtr AllocCoTaskMem (int cb);
76 [MethodImplAttribute(MethodImplOptions.InternalCall)]
77 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.MayFail)]
78 public extern static IntPtr AllocHGlobal (IntPtr cb);
80 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.MayFail)]
81 public static IntPtr AllocHGlobal (int cb)
83 return AllocHGlobal ((IntPtr)cb);
86 [MonoTODO]
87 public static object BindToMoniker (string monikerName)
89 throw new NotImplementedException ();
92 [MonoTODO]
93 public static void ChangeWrapperHandleStrength (object otp, bool fIsWeak)
95 throw new NotImplementedException ();
98 [MethodImplAttribute(MethodImplOptions.InternalCall)]
99 internal extern static void copy_to_unmanaged (Array source, int startIndex,
100 IntPtr destination, int length);
102 [MethodImplAttribute(MethodImplOptions.InternalCall)]
103 internal extern static void copy_from_unmanaged (IntPtr source, int startIndex,
104 Array destination, int length);
106 public static void Copy (byte[] source, int startIndex, IntPtr destination, int length)
108 copy_to_unmanaged (source, startIndex, destination, length);
111 public static void Copy (char[] source, int startIndex, IntPtr destination, int length)
113 copy_to_unmanaged (source, startIndex, destination, length);
116 public static void Copy (short[] source, int startIndex, IntPtr destination, int length)
118 copy_to_unmanaged (source, startIndex, destination, length);
121 public static void Copy (int[] source, int startIndex, IntPtr destination, int length)
123 copy_to_unmanaged (source, startIndex, destination, length);
126 public static void Copy (long[] source, int startIndex, IntPtr destination, int length)
128 copy_to_unmanaged (source, startIndex, destination, length);
131 public static void Copy (float[] source, int startIndex, IntPtr destination, int length)
133 copy_to_unmanaged (source, startIndex, destination, length);
136 public static void Copy (double[] source, int startIndex, IntPtr destination, int length)
138 copy_to_unmanaged (source, startIndex, destination, length);
141 public static void Copy (IntPtr[] source, int startIndex, IntPtr destination, int length)
143 copy_to_unmanaged (source, startIndex, destination, length);
146 public static void Copy (IntPtr source, byte[] destination, int startIndex, int length)
148 copy_from_unmanaged (source, startIndex, destination, length);
151 public static void Copy (IntPtr source, char[] destination, int startIndex, int length)
153 copy_from_unmanaged (source, startIndex, destination, length);
156 public static void Copy (IntPtr source, short[] destination, int startIndex, int length)
158 copy_from_unmanaged (source, startIndex, destination, length);
161 public static void Copy (IntPtr source, int[] destination, int startIndex, int length)
163 copy_from_unmanaged (source, startIndex, destination, length);
166 public static void Copy (IntPtr source, long[] destination, int startIndex, int length)
168 copy_from_unmanaged (source, startIndex, destination, length);
171 public static void Copy (IntPtr source, float[] destination, int startIndex, int length)
173 copy_from_unmanaged (source, startIndex, destination, length);
176 public static void Copy (IntPtr source, double[] destination, int startIndex, int length)
178 copy_from_unmanaged (source, startIndex, destination, length);
181 public static void Copy (IntPtr source, IntPtr[] destination, int startIndex, int length)
183 copy_from_unmanaged (source, startIndex, destination, length);
186 public static IntPtr CreateAggregatedObject (IntPtr pOuter,
187 object o)
189 throw new NotImplementedException ();
192 #if !MOONLIGHT
193 public static object CreateWrapperOfType (object o, Type t)
195 __ComObject co = o as __ComObject;
196 if (co == null)
197 throw new ArgumentException ("o must derive from __ComObject", "o");
198 if (t == null)
199 throw new ArgumentNullException ("t");
201 Type[] itfs = o.GetType ().GetInterfaces ();
202 foreach (Type itf in itfs) {
203 if (itf.IsImport && co.GetInterface (itf) == IntPtr.Zero)
204 throw new InvalidCastException ();
207 return ComInteropProxy.GetProxy (co.IUnknown, t).GetTransparentProxy ();
209 #endif
211 [MethodImplAttribute(MethodImplOptions.InternalCall)]
212 [ComVisible (true)]
213 public extern static void DestroyStructure (IntPtr ptr, Type structuretype);
215 [MethodImplAttribute(MethodImplOptions.InternalCall)]
216 public extern static void FreeBSTR (IntPtr ptr);
218 [MethodImplAttribute(MethodImplOptions.InternalCall)]
219 public extern static void FreeCoTaskMem (IntPtr ptr);
221 [MethodImplAttribute(MethodImplOptions.InternalCall)]
222 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
223 public extern static void FreeHGlobal (IntPtr hglobal);
225 static void ClearBSTR (IntPtr ptr)
227 int len = ReadInt32 (ptr, -4);
229 for (int i = 0; i < len; i++)
230 WriteByte (ptr, i, 0);
233 public static void ZeroFreeBSTR (IntPtr s)
235 ClearBSTR (s);
236 FreeBSTR (s);
239 static void ClearAnsi (IntPtr ptr)
241 for (int i = 0; ReadByte (ptr, i) != 0; i++)
242 WriteByte (ptr, i, 0);
245 static void ClearUnicode (IntPtr ptr)
247 for (int i = 0; ReadInt16 (ptr, i) != 0; i += 2)
248 WriteInt16 (ptr, i, 0);
251 public static void ZeroFreeCoTaskMemAnsi (IntPtr s)
253 ClearAnsi (s);
254 FreeCoTaskMem (s);
257 public static void ZeroFreeCoTaskMemUnicode (IntPtr s)
259 ClearUnicode (s);
260 FreeCoTaskMem (s);
263 public static void ZeroFreeGlobalAllocAnsi (IntPtr s)
265 ClearAnsi (s);
266 FreeHGlobal (s);
269 public static void ZeroFreeGlobalAllocUnicode (IntPtr s)
271 ClearUnicode (s);
272 FreeHGlobal (s);
275 #if !MOONLIGHT
276 public static Guid GenerateGuidForType (Type type)
278 return type.GUID;
281 [MonoTODO]
282 public static string GenerateProgIdForType (Type type)
284 throw new NotImplementedException ();
287 [MonoTODO]
288 public static object GetActiveObject (string progID)
290 throw new NotImplementedException ();
293 [MethodImplAttribute (MethodImplOptions.InternalCall)]
294 private extern static IntPtr GetCCW (object o, Type T);
296 private static IntPtr GetComInterfaceForObjectInternal (object o, Type T)
298 if (IsComObject (o))
299 return ((__ComObject)o).GetInterface (T);
300 else
301 return GetCCW (o, T);
304 public static IntPtr GetComInterfaceForObject (object o, Type T)
306 IntPtr pItf = GetComInterfaceForObjectInternal (o, T);
307 AddRef (pItf);
308 return pItf;
311 [MonoTODO]
312 public static IntPtr GetComInterfaceForObjectInContext (object o, Type t)
314 throw new NotImplementedException ();
317 [MonoNotSupportedAttribute ("MSDN states user code should never need to call this method.")]
318 public static object GetComObjectData (object obj, object key)
320 throw new NotSupportedException ("MSDN states user code should never need to call this method.");
323 [MethodImplAttribute(MethodImplOptions.InternalCall)]
324 private extern static int GetComSlotForMethodInfoInternal (MemberInfo m);
326 public static int GetComSlotForMethodInfo (MemberInfo m)
328 if (m == null)
329 throw new ArgumentNullException ("m");
330 if (!(m is MethodInfo))
331 throw new ArgumentException ("The MemberInfo must be an interface method.", "m");
332 if (!m.DeclaringType.IsInterface)
333 throw new ArgumentException ("The MemberInfo must be an interface method.", "m");
334 return GetComSlotForMethodInfoInternal (m);
337 [MonoTODO]
338 public static int GetEndComSlot (Type t)
340 throw new NotImplementedException ();
343 [MonoTODO]
344 public static int GetExceptionCode()
346 throw new NotImplementedException ();
349 [MonoTODO]
350 [ComVisible (true)]
351 public static IntPtr GetExceptionPointers()
353 throw new NotImplementedException ();
356 public static IntPtr GetHINSTANCE (Module m)
358 if (m == null)
359 throw new ArgumentNullException ("m");
361 return m.GetHINSTANCE ();
363 #endif // !NET_2_1
365 [MonoTODO ("SetErrorInfo")]
366 public static int GetHRForException (Exception e)
368 return e.hresult;
371 [MonoTODO]
372 [ReliabilityContract (Consistency.WillNotCorruptState, Cer.Success)]
373 public static int GetHRForLastWin32Error()
375 throw new NotImplementedException ();
377 #if !MOONLIGHT
378 [MethodImplAttribute (MethodImplOptions.InternalCall)]
379 private extern static IntPtr GetIDispatchForObjectInternal (object o);
381 public static IntPtr GetIDispatchForObject (object o)
383 IntPtr pUnk = GetIDispatchForObjectInternal (o);
384 // Internal method does not AddRef
385 AddRef (pUnk);
386 return pUnk;
389 [MonoTODO]
390 public static IntPtr GetIDispatchForObjectInContext (object o)
392 throw new NotImplementedException ();
395 [MonoTODO]
396 public static IntPtr GetITypeInfoForType (Type t)
398 throw new NotImplementedException ();
401 [MethodImplAttribute (MethodImplOptions.InternalCall)]
402 private extern static IntPtr GetIUnknownForObjectInternal (object o);
404 public static IntPtr GetIUnknownForObject (object o)
406 IntPtr pUnk = GetIUnknownForObjectInternal (o);
407 // Internal method does not AddRef
408 AddRef (pUnk);
409 return pUnk;
412 [MonoTODO]
413 public static IntPtr GetIUnknownForObjectInContext (object o)
415 throw new NotImplementedException ();
418 [MonoTODO]
419 [Obsolete ("This method has been deprecated")]
420 public static IntPtr GetManagedThunkForUnmanagedMethodPtr (IntPtr pfnMethodToWrap, IntPtr pbSignature, int cbSignature)
422 throw new NotImplementedException ();
425 [MonoTODO]
426 public static MemberInfo GetMethodInfoForComSlot (Type t, int slot, ref ComMemberType memberType)
428 throw new NotImplementedException ();
431 public static void GetNativeVariantForObject (object obj, IntPtr pDstNativeVariant)
433 Variant vt = new Variant();
434 vt.SetValue(obj);
435 Marshal.StructureToPtr(vt, pDstNativeVariant, false);
438 [MethodImplAttribute (MethodImplOptions.InternalCall)]
439 private static extern object GetObjectForCCW (IntPtr pUnk);
441 public static object GetObjectForIUnknown (IntPtr pUnk)
443 object obj = GetObjectForCCW (pUnk);
444 // was not a CCW
445 if (obj == null) {
446 ComInteropProxy proxy = ComInteropProxy.GetProxy (pUnk, typeof (__ComObject));
447 obj = proxy.GetTransparentProxy ();
449 return obj;
452 public static object GetObjectForNativeVariant (IntPtr pSrcNativeVariant)
454 Variant vt = (Variant)Marshal.PtrToStructure(pSrcNativeVariant, typeof(Variant));
455 return vt.GetValue();
458 public static object[] GetObjectsForNativeVariants (IntPtr aSrcNativeVariant, int cVars)
460 if (cVars < 0)
461 throw new ArgumentOutOfRangeException ("cVars", "cVars cannot be a negative number.");
462 object[] objects = new object[cVars];
463 for (int i = 0; i < cVars; i++)
464 objects[i] = GetObjectForNativeVariant ((IntPtr)(aSrcNativeVariant.ToInt64 () +
465 i * SizeOf (typeof(Variant))));
466 return objects;
469 [MonoTODO]
470 public static int GetStartComSlot (Type t)
472 throw new NotImplementedException ();
475 [MonoTODO]
476 [Obsolete ("This method has been deprecated")]
477 public static Thread GetThreadFromFiberCookie (int cookie)
479 throw new NotImplementedException ();
482 public static object GetTypedObjectForIUnknown (IntPtr pUnk, Type t)
484 ComInteropProxy proxy = new ComInteropProxy (pUnk, t);
485 __ComObject co = (__ComObject)proxy.GetTransparentProxy ();
486 foreach (Type itf in t.GetInterfaces ()) {
487 if ((itf.Attributes & TypeAttributes.Import) == TypeAttributes.Import) {
488 if (co.GetInterface (itf) == IntPtr.Zero)
489 return null;
492 return co;
495 [MonoTODO]
496 public static Type GetTypeForITypeInfo (IntPtr piTypeInfo)
498 throw new NotImplementedException ();
501 [Obsolete]
502 [MonoTODO]
503 public static string GetTypeInfoName (UCOMITypeInfo pTI)
505 throw new NotImplementedException ();
508 public static string GetTypeInfoName (ITypeInfo typeInfo)
510 throw new NotImplementedException ();
513 [Obsolete]
514 [MonoTODO]
515 public static Guid GetTypeLibGuid (UCOMITypeLib pTLB)
517 throw new NotImplementedException ();
520 [MonoTODO]
521 public static Guid GetTypeLibGuid (ITypeLib typelib)
523 throw new NotImplementedException ();
526 [MonoTODO]
527 public static Guid GetTypeLibGuidForAssembly (Assembly asm)
529 throw new NotImplementedException ();
532 [Obsolete]
533 [MonoTODO]
534 public static int GetTypeLibLcid (UCOMITypeLib pTLB)
536 throw new NotImplementedException ();
539 [MonoTODO]
540 public static int GetTypeLibLcid (ITypeLib typelib)
542 throw new NotImplementedException ();
545 [Obsolete]
546 [MonoTODO]
547 public static string GetTypeLibName (UCOMITypeLib pTLB)
549 throw new NotImplementedException ();
552 [MonoTODO]
553 public static string GetTypeLibName (ITypeLib typelib)
555 throw new NotImplementedException ();
558 [MonoTODO]
559 public static void GetTypeLibVersionForAssembly (Assembly inputAssembly, out int majorVersion, out int minorVersion)
561 throw new NotImplementedException ();
564 public static object GetUniqueObjectForIUnknown (IntPtr unknown)
566 throw new NotImplementedException ();
569 [MonoTODO]
570 [Obsolete ("This method has been deprecated")]
571 public static IntPtr GetUnmanagedThunkForManagedMethodPtr (IntPtr pfnMethodToWrap, IntPtr pbSignature, int cbSignature)
573 throw new NotImplementedException ();
576 [MethodImplAttribute (MethodImplOptions.InternalCall)]
577 public extern static bool IsComObject (object o);
579 [MonoTODO]
580 public static bool IsTypeVisibleFromCom (Type t)
582 throw new NotImplementedException ();
585 [MonoTODO]
586 public static int NumParamBytes (MethodInfo m)
588 throw new NotImplementedException ();
590 #endif // !NET_2_1
592 [MethodImplAttribute(MethodImplOptions.InternalCall)]
593 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
594 public static extern int GetLastWin32Error();
596 [MethodImplAttribute(MethodImplOptions.InternalCall)]
597 public extern static IntPtr OffsetOf (Type t, string fieldName);
599 [MethodImplAttribute(MethodImplOptions.InternalCall)]
600 public extern static void Prelink (MethodInfo m);
602 [MethodImplAttribute(MethodImplOptions.InternalCall)]
603 public extern static void PrelinkAll (Type c);
605 [MethodImplAttribute(MethodImplOptions.InternalCall)]
606 public extern static string PtrToStringAnsi (IntPtr ptr);
608 [MethodImplAttribute(MethodImplOptions.InternalCall)]
609 public extern static string PtrToStringAnsi (IntPtr ptr, int len);
611 public static string PtrToStringAuto (IntPtr ptr)
613 return SystemDefaultCharSize == 2
614 ? PtrToStringUni (ptr) : PtrToStringAnsi (ptr);
617 public static string PtrToStringAuto (IntPtr ptr, int len)
619 return SystemDefaultCharSize == 2
620 ? PtrToStringUni (ptr, len) : PtrToStringAnsi (ptr, len);
623 [MethodImplAttribute(MethodImplOptions.InternalCall)]
624 public extern static string PtrToStringUni (IntPtr ptr);
626 [MethodImplAttribute(MethodImplOptions.InternalCall)]
627 public extern static string PtrToStringUni (IntPtr ptr, int len);
629 [MethodImplAttribute(MethodImplOptions.InternalCall)]
630 public extern static string PtrToStringBSTR (IntPtr ptr);
632 [MethodImplAttribute(MethodImplOptions.InternalCall)]
633 [ComVisible (true)]
634 public extern static void PtrToStructure (IntPtr ptr, object structure);
636 [MethodImplAttribute(MethodImplOptions.InternalCall)]
637 [ComVisible (true)]
638 public extern static object PtrToStructure (IntPtr ptr, Type structureType);
640 [MethodImplAttribute (MethodImplOptions.InternalCall)]
641 private extern static int QueryInterfaceInternal (IntPtr pUnk, ref Guid iid, out IntPtr ppv);
643 public static int QueryInterface (IntPtr pUnk, ref Guid iid, out IntPtr ppv)
645 if (pUnk == IntPtr.Zero)
646 throw new ArgumentException ("Value cannot be null.", "pUnk");
647 return QueryInterfaceInternal (pUnk, ref iid, out ppv);
650 public static byte ReadByte (IntPtr ptr)
652 return ReadByte (ptr, 0);
655 [MethodImplAttribute(MethodImplOptions.InternalCall)]
656 public extern static byte ReadByte (IntPtr ptr, int ofs);
658 [MonoTODO]
659 public static byte ReadByte ([In, MarshalAs (UnmanagedType.AsAny)] object ptr, int ofs)
661 throw new NotImplementedException ();
664 public static short ReadInt16 (IntPtr ptr)
666 return ReadInt16 (ptr, 0);
669 [MethodImplAttribute(MethodImplOptions.InternalCall)]
670 public extern static short ReadInt16 (IntPtr ptr, int ofs);
672 [MonoTODO]
673 public static short ReadInt16 ([In, MarshalAs(UnmanagedType.AsAny)] object ptr, int ofs)
675 throw new NotImplementedException ();
678 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
679 public static int ReadInt32 (IntPtr ptr)
681 return ReadInt32 (ptr, 0);
684 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
685 [MethodImplAttribute(MethodImplOptions.InternalCall)]
686 public extern static int ReadInt32 (IntPtr ptr, int ofs);
688 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
689 [MonoTODO]
690 public static int ReadInt32 ([In, MarshalAs(UnmanagedType.AsAny)] object ptr, int ofs)
692 throw new NotImplementedException ();
695 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
696 public static long ReadInt64 (IntPtr ptr)
698 return ReadInt64 (ptr, 0);
701 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
702 [MethodImplAttribute(MethodImplOptions.InternalCall)]
703 public extern static long ReadInt64 (IntPtr ptr, int ofs);
705 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
706 [MonoTODO]
707 public static long ReadInt64 ([In, MarshalAs (UnmanagedType.AsAny)] object ptr, int ofs)
709 throw new NotImplementedException ();
712 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
713 public static IntPtr ReadIntPtr (IntPtr ptr)
715 return ReadIntPtr (ptr, 0);
718 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
719 [MethodImplAttribute(MethodImplOptions.InternalCall)]
720 public extern static IntPtr ReadIntPtr (IntPtr ptr, int ofs);
722 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
723 [MonoTODO]
724 public static IntPtr ReadIntPtr ([In, MarshalAs (UnmanagedType.AsAny)] object ptr, int ofs)
726 throw new NotImplementedException ();
729 [MethodImplAttribute (MethodImplOptions.InternalCall)]
730 public extern static IntPtr ReAllocCoTaskMem (IntPtr pv, int cb);
732 [MethodImplAttribute(MethodImplOptions.InternalCall)]
733 public extern static IntPtr ReAllocHGlobal (IntPtr pv, IntPtr cb);
735 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
736 [MethodImplAttribute (MethodImplOptions.InternalCall)]
737 private extern static int ReleaseInternal (IntPtr pUnk);
739 [ReliabilityContract (Consistency.WillNotCorruptState, Cer.Success)]
740 public static int Release (IntPtr pUnk)
742 if (pUnk == IntPtr.Zero)
743 throw new ArgumentException ("Value cannot be null.", "pUnk");
744 return ReleaseInternal (pUnk);
747 #if !MOONLIGHT
748 [MethodImplAttribute (MethodImplOptions.InternalCall)]
749 private extern static int ReleaseComObjectInternal (object co);
751 public static int ReleaseComObject (object o)
753 if (o == null)
754 throw new ArgumentException ("Value cannot be null.", "o");
755 if (!IsComObject (o))
756 throw new ArgumentException ("Value must be a Com object.", "o");
757 return ReleaseComObjectInternal (o);
760 [Obsolete]
761 [MonoTODO]
762 public static void ReleaseThreadCache()
764 throw new NotImplementedException ();
767 [MonoNotSupportedAttribute ("MSDN states user code should never need to call this method.")]
768 public static bool SetComObjectData (object obj, object key, object data)
770 throw new NotSupportedException ("MSDN states user code should never need to call this method.");
772 #endif // !NET_2_1
774 [ComVisible (true)]
775 public static int SizeOf (object structure)
777 return SizeOf (structure.GetType ());
780 [MethodImplAttribute(MethodImplOptions.InternalCall)]
781 public extern static int SizeOf (Type t);
783 [MethodImplAttribute(MethodImplOptions.InternalCall)]
784 public extern static IntPtr StringToBSTR (string s);
787 // I believe this is wrong, because in Mono and in P/Invoke
788 // we treat "Ansi" conversions as UTF-8 conversions, while
789 // this one does not do this
791 public static IntPtr StringToCoTaskMemAnsi (string s)
793 int length = s.Length + 1;
794 IntPtr ctm = AllocCoTaskMem (length);
796 byte[] asBytes = new byte[length];
797 for (int i = 0; i < s.Length; i++)
798 asBytes[i] = (byte)s[i];
799 asBytes[s.Length] = 0;
801 copy_to_unmanaged (asBytes, 0, ctm, length);
802 return ctm;
805 public static IntPtr StringToCoTaskMemAuto (string s)
807 return SystemDefaultCharSize == 2
808 ? StringToCoTaskMemUni (s) : StringToCoTaskMemAnsi (s);
811 public static IntPtr StringToCoTaskMemUni (string s)
813 int length = s.Length + 1;
814 IntPtr ctm = AllocCoTaskMem (length * 2);
816 char[] asChars = new char[length];
817 s.CopyTo (0, asChars, 0, s.Length);
818 asChars[s.Length] = '\0';
820 copy_to_unmanaged (asChars, 0, ctm, length);
821 return ctm;
824 [MethodImplAttribute(MethodImplOptions.InternalCall)]
825 public extern static IntPtr StringToHGlobalAnsi (string s);
827 public static IntPtr StringToHGlobalAuto (string s)
829 return SystemDefaultCharSize == 2
830 ? StringToHGlobalUni (s) : StringToHGlobalAnsi (s);
833 [MethodImplAttribute(MethodImplOptions.InternalCall)]
834 public extern static IntPtr StringToHGlobalUni (string s);
836 #if !MOONLIGHT
837 public static IntPtr SecureStringToBSTR (SecureString s)
839 if (s == null)
840 throw new ArgumentNullException ("s");
841 int len = s.Length;
842 IntPtr ctm = AllocCoTaskMem ((len+1) * 2 + 4);
843 byte [] buffer = null;
844 WriteInt32 (ctm, 0, len*2);
845 try {
846 buffer = s.GetBuffer ();
848 for (int i = 0; i < len; i++)
849 WriteInt16 (ctm, 4 + (i * 2), (short) ((buffer [(i*2)] << 8) | (buffer [i*2+1])));
850 WriteInt16 (ctm, 4 + buffer.Length, 0);
851 } finally {
852 if (buffer != null)
853 for (int i = buffer.Length; i > 0; ){
854 i--;
855 buffer [i] = 0;
858 return (IntPtr) ((long)ctm + 4);
861 public static IntPtr SecureStringToCoTaskMemAnsi (SecureString s)
863 if (s == null)
864 throw new ArgumentNullException ("s");
865 int len = s.Length;
866 IntPtr ctm = AllocCoTaskMem (len + 1);
867 byte [] copy = new byte [len+1];
869 try {
870 byte [] buffer = s.GetBuffer ();
871 int i = 0, j = 0;
872 for (; i < len; i++, j += 2){
873 copy [i] = buffer [j+1];
874 buffer [j] = 0;
875 buffer [j+1] = 0;
877 copy [i] = 0;
878 copy_to_unmanaged (copy, 0, ctm, len+1);
879 } finally {
880 // Ensure that we clear the buffer.
881 for (int i = len; i > 0; ){
882 i--;
883 copy [i] = 0;
886 return ctm;
889 public static IntPtr SecureStringToCoTaskMemUnicode (SecureString s)
891 if (s == null)
892 throw new ArgumentNullException ("s");
893 int len = s.Length;
894 IntPtr ctm = AllocCoTaskMem (len * 2 + 2);
895 byte [] buffer = null;
896 try {
897 buffer = s.GetBuffer ();
898 for (int i = 0; i < len; i++)
899 WriteInt16 (ctm, i * 2, (short) ((buffer [(i*2)] << 8) | (buffer [i*2+1])));
900 WriteInt16 (ctm, buffer.Length, 0);
901 } finally {
902 if (buffer != null)
903 for (int i = buffer.Length; i > 0; ){
904 i--;
905 buffer [i] = 0;
908 return ctm;
911 public static IntPtr SecureStringToGlobalAllocAnsi (SecureString s)
913 if (s == null)
914 throw new ArgumentNullException ("s");
915 return SecureStringToCoTaskMemAnsi (s);
918 public static IntPtr SecureStringToGlobalAllocUnicode (SecureString s)
920 if (s == null)
921 throw new ArgumentNullException ("s");
922 return SecureStringToCoTaskMemUnicode (s);
924 #endif
926 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.MayFail)]
927 [ComVisible (true)]
928 [MethodImplAttribute(MethodImplOptions.InternalCall)]
929 public extern static void StructureToPtr (object structure, IntPtr ptr, bool fDeleteOld);
931 public static void ThrowExceptionForHR (int errorCode) {
932 Exception ex = GetExceptionForHR (errorCode);
933 if (ex != null)
934 throw ex;
937 public static void ThrowExceptionForHR (int errorCode, IntPtr errorInfo) {
938 Exception ex = GetExceptionForHR (errorCode, errorInfo);
939 if (ex != null)
940 throw ex;
943 [MethodImplAttribute(MethodImplOptions.InternalCall)]
944 public extern static IntPtr UnsafeAddrOfPinnedArrayElement (Array arr, int index);
946 public static void WriteByte (IntPtr ptr, byte val)
948 WriteByte (ptr, 0, val);
951 [MethodImplAttribute(MethodImplOptions.InternalCall)]
952 public extern static void WriteByte (IntPtr ptr, int ofs, byte val);
954 [MonoTODO]
955 public static void WriteByte ([In, Out, MarshalAs (UnmanagedType.AsAny)] object ptr, int ofs, byte val)
957 throw new NotImplementedException ();
960 public static void WriteInt16 (IntPtr ptr, short val)
962 WriteInt16 (ptr, 0, val);
965 [MethodImplAttribute(MethodImplOptions.InternalCall)]
966 public extern static void WriteInt16 (IntPtr ptr, int ofs, short val);
968 [MonoTODO]
969 public static void WriteInt16 ([In, Out, MarshalAs (UnmanagedType.AsAny)] object ptr, int ofs, short val)
971 throw new NotImplementedException ();
974 public static void WriteInt16 (IntPtr ptr, char val)
976 WriteInt16 (ptr, 0, val);
979 [MonoTODO]
980 [MethodImplAttribute(MethodImplOptions.InternalCall)]
981 public extern static void WriteInt16 (IntPtr ptr, int ofs, char val);
983 [MonoTODO]
984 public static void WriteInt16([In, Out] object ptr, int ofs, char val)
986 throw new NotImplementedException ();
989 public static void WriteInt32 (IntPtr ptr, int val)
991 WriteInt32 (ptr, 0, val);
994 [MethodImplAttribute(MethodImplOptions.InternalCall)]
995 public extern static void WriteInt32 (IntPtr ptr, int ofs, int val);
997 [MonoTODO]
998 public static void WriteInt32([In, Out, MarshalAs(UnmanagedType.AsAny)] object ptr, int ofs, int val)
1000 throw new NotImplementedException ();
1003 public static void WriteInt64 (IntPtr ptr, long val)
1005 WriteInt64 (ptr, 0, val);
1008 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1009 public extern static void WriteInt64 (IntPtr ptr, int ofs, long val);
1011 [MonoTODO]
1012 public static void WriteInt64 ([In, Out, MarshalAs (UnmanagedType.AsAny)] object ptr, int ofs, long val)
1014 throw new NotImplementedException ();
1017 public static void WriteIntPtr (IntPtr ptr, IntPtr val)
1019 WriteIntPtr (ptr, 0, val);
1022 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1023 public extern static void WriteIntPtr (IntPtr ptr, int ofs, IntPtr val);
1025 [MonoTODO]
1026 public static void WriteIntPtr([In, Out, MarshalAs(UnmanagedType.AsAny)] object ptr, int ofs, IntPtr val)
1028 throw new NotImplementedException ();
1031 public static Exception GetExceptionForHR (int errorCode) {
1032 return GetExceptionForHR (errorCode, IntPtr.Zero);
1035 public static Exception GetExceptionForHR (int errorCode, IntPtr errorInfo) {
1037 const int E_OUTOFMEMORY = unchecked ((int)0x8007000EL);
1038 const int E_INVALIDARG = unchecked ((int)0X80070057);
1040 switch (errorCode)
1042 case E_OUTOFMEMORY:
1043 return new OutOfMemoryException ();
1044 case E_INVALIDARG:
1045 return new ArgumentException ();
1047 if (errorCode < 0)
1048 return new COMException ("", errorCode);
1049 return null;
1052 #if !MOONLIGHT
1053 public static int FinalReleaseComObject (object o)
1055 while (ReleaseComObject (o) != 0);
1056 return 0;
1058 #endif
1060 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1061 private static extern Delegate GetDelegateForFunctionPointerInternal (IntPtr ptr, Type t);
1063 public static Delegate GetDelegateForFunctionPointer (IntPtr ptr, Type t)
1065 if (t == null)
1066 throw new ArgumentNullException ("t");
1067 if (!t.IsSubclassOf (typeof (MulticastDelegate)) || (t == typeof (MulticastDelegate)))
1068 throw new ArgumentException ("Type is not a delegate", "t");
1069 if (ptr == IntPtr.Zero)
1070 throw new ArgumentNullException ("ptr");
1072 return GetDelegateForFunctionPointerInternal (ptr, t);
1075 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1076 private static extern IntPtr GetFunctionPointerForDelegateInternal (Delegate d);
1078 public static IntPtr GetFunctionPointerForDelegate (Delegate d)
1080 if (d == null)
1081 throw new ArgumentNullException ("d");
1083 return GetFunctionPointerForDelegateInternal (d);