<Compile Include="$(BclSourcesRoot)\System\Reflection\MemberSerializationStringGenerator.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\MethodBase.CoreCLR.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\MethodBody.cs" />
- <Compile Include="$(BclSourcesRoot)\System\Reflection\Pointer.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\RtFieldInfo.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\RuntimeAssembly.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\RuntimeConstructorInfo.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\Reflection\ParameterAttributes.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\Reflection\ParameterInfo.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\Reflection\ParameterModifier.cs" />
+ <Compile Include="$(MSBuildThisFileDirectory)System\Reflection\Pointer.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\Reflection\PortableExecutableKinds.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\Reflection\ProcessorArchitecture.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\Reflection\PropertyAttributes.cs" />
--- /dev/null
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Diagnostics;
+using System.Runtime.Serialization;
+
+namespace System.Reflection
+{
+ [Serializable]
+ [CLSCompliant(false)]
+ public sealed unsafe class Pointer : ISerializable
+ {
+ // CoreCLR: Do not add or remove fields without updating the ReflectionPointer class in runtimehandles.h
+ private readonly void* _ptr;
+ private readonly Type _ptrType;
+
+ private Pointer(void* ptr, Type ptrType)
+ {
+ Debug.Assert(ptrType.IsRuntimeImplemented()); // CoreCLR: For CoreRT's sake, _ptrType has to be declared as "Type", but in fact, it is always a RuntimeType. Code on CoreCLR expects this.
+ _ptr = ptr;
+ _ptrType = ptrType;
+ }
+
+ private Pointer(SerializationInfo info, StreamingContext context)
+ {
+ _ptr = ((IntPtr)(info.GetValue("_ptr", typeof(IntPtr)))).ToPointer();
+ _ptrType = (Type)info.GetValue("_ptrType", typeof(Type));
+ if (!_ptrType.IsRuntimeImplemented())
+ throw new SerializationException(SR.Arg_MustBeType);
+ }
+
+ public static object Box(void* ptr, Type type)
+ {
+ if (type == null)
+ throw new ArgumentNullException(nameof(type));
+ if (!type.IsPointer)
+ throw new ArgumentException(SR.Arg_MustBePointer, nameof(ptr));
+ if (!type.IsRuntimeImplemented())
+ throw new ArgumentException(SR.Arg_MustBeType, nameof(ptr));
+
+ return new Pointer(ptr, type);
+ }
+
+ public static void* Unbox(object ptr)
+ {
+ if (!(ptr is Pointer))
+ throw new ArgumentException(SR.Arg_MustBePointer, nameof(ptr));
+ return ((Pointer)ptr)._ptr;
+ }
+
+ void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
+ {
+ info.AddValue("_ptr", new IntPtr(_ptr));
+ info.AddValue("_ptrType", _ptrType);
+ }
+
+ internal Type GetPointerType() => _ptrType;
+ internal object GetPointerValue() => (IntPtr)_ptr;
+ }
+}
+++ /dev/null
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more 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]
- public sealed class Pointer : ISerializable
- {
- unsafe private void* _ptr;
- private RuntimeType _ptrType;
-
- private Pointer() { }
-
- 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.
- public static unsafe Object Box(void* ptr, Type type)
- {
- if (type == null)
- throw new ArgumentNullException(nameof(type));
- if (!type.IsPointer)
- throw new ArgumentException(SR.Arg_MustBePointer, nameof(ptr));
- Contract.EndContractBlock();
-
- RuntimeType rt = type as RuntimeType;
- if (rt == null)
- throw new ArgumentException(SR.Arg_MustBePointer, nameof(ptr));
-
- Pointer x = new Pointer();
- x._ptr = ptr;
- x._ptrType = rt;
- return x;
- }
-
- // Returned the stored pointer.
- public static unsafe void* Unbox(Object ptr)
- {
- if (!(ptr is Pointer))
- throw new ArgumentException(SR.Arg_MustBePointer, nameof(ptr));
- return ((Pointer)ptr)._ptr;
- }
-
- internal RuntimeType GetPointerType()
- {
- return _ptrType;
- }
-
- internal unsafe Object GetPointerValue()
- {
- return (IntPtr)_ptr;
- }
-
- unsafe void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
- {
- info.AddValue("_ptr", new IntPtr(_ptr));
- info.AddValue("_ptrType", _ptrType);
- }
- }
-}
RuntimeType valueType;
Pointer pointer = value as Pointer;
if (pointer != null)
- valueType = pointer.GetPointerType();
+ valueType = (RuntimeType)pointer.GetPointerType();
else
valueType = (RuntimeType)value.GetType();
RuntimeType valueType;
Pointer pointer = value as Pointer;
if (pointer != null)
- valueType = pointer.GetPointerType();
+ valueType = (RuntimeType)pointer.GetPointerType();
else
valueType = (RuntimeType)value.GetType();