summaryrefslogtreecommitdiff
path: root/src/mscorlib/src/System/Reflection/Pointer.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/mscorlib/src/System/Reflection/Pointer.cs')
-rw-r--r--src/mscorlib/src/System/Reflection/Pointer.cs82
1 files changed, 82 insertions, 0 deletions
diff --git a/src/mscorlib/src/System/Reflection/Pointer.cs b/src/mscorlib/src/System/Reflection/Pointer.cs
new file mode 100644
index 0000000000..da997924eb
--- /dev/null
+++ b/src/mscorlib/src/System/Reflection/Pointer.cs
@@ -0,0 +1,82 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// This is a wrapper class for Pointers
+//
+//
+//
+//
+//
+namespace System.Reflection {
+ using System;
+ using CultureInfo = System.Globalization.CultureInfo;
+ using System.Runtime.Serialization;
+ using System.Security;
+ using System.Diagnostics.Contracts;
+
+ [CLSCompliant(false)]
+ [Serializable]
+ [System.Runtime.InteropServices.ComVisible(true)]
+ public sealed class Pointer: ISerializable {
+ [SecurityCritical]
+ unsafe private void* _ptr;
+ private RuntimeType _ptrType;
+
+ private Pointer() {}
+
+ [System.Security.SecurityCritical] // auto-generated
+ private unsafe Pointer(SerializationInfo info, StreamingContext context)
+ {
+ _ptr = ((IntPtr)(info.GetValue("_ptr", typeof(IntPtr)))).ToPointer();
+ _ptrType = (RuntimeType)info.GetValue("_ptrType", typeof(RuntimeType));
+ }
+
+ // This method will box an pointer. We save both the
+ // value and the type so we can access it from the native code
+ // during an Invoke.
+ [System.Security.SecurityCritical] // auto-generated
+ public static unsafe Object Box(void *ptr,Type type) {
+ if (type == null)
+ throw new ArgumentNullException("type");
+ if (!type.IsPointer)
+ throw new ArgumentException(Environment.GetResourceString("Arg_MustBePointer"),"ptr");
+ Contract.EndContractBlock();
+
+ RuntimeType rt = type as RuntimeType;
+ if (rt == null)
+ throw new ArgumentException(Environment.GetResourceString("Arg_MustBePointer"), "ptr");
+
+ Pointer x = new Pointer();
+ x._ptr = ptr;
+ x._ptrType = rt;
+ return x;
+ }
+
+ // Returned the stored pointer.
+ [System.Security.SecurityCritical] // auto-generated
+ public static unsafe void* Unbox(Object ptr) {
+ if (!(ptr is Pointer))
+ throw new ArgumentException(Environment.GetResourceString("Arg_MustBePointer"),"ptr");
+ return ((Pointer)ptr)._ptr;
+ }
+
+ internal RuntimeType GetPointerType() {
+ return _ptrType;
+ }
+
+ [System.Security.SecurityCritical] // auto-generated
+ internal unsafe Object GetPointerValue() {
+ return (IntPtr)_ptr;
+ }
+
+#if FEATURE_SERIALIZATION
+ [System.Security.SecurityCritical]
+ unsafe void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) {
+ info.AddValue("_ptr", new IntPtr(_ptr));
+ info.AddValue("_ptrType", _ptrType);
+ }
+#endif
+ }
+}