<Compile Include="$(BclSourcesRoot)\System\Reflection\BindingFlags.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\CallingConventions.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\ConstructorInfo.cs" />
+ <Compile Include="$(BclSourcesRoot)\System\Reflection\ConstructorInfo.CoreCLR.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\CustomAttribute.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\DefaultMemberAttribute.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\EventAttributes.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\EventInfo.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\FieldAttributes.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\FieldInfo.cs" />
+ <Compile Include="$(BclSourcesRoot)\System\Reflection\FieldInfo.CoreCLR.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\GenericParameterAttributes.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\ICustomAttributeProvider.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\IReflectableType.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\IntrospectionExtensions.cs" />
+ <Compile Include="$(BclSourcesRoot)\System\Reflection\ImageFileMachine.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\InterfaceMapping.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\InvalidFilterCriteriaException.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\INVOCATION_FLAGS.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\LoaderAllocator.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\ManifestResourceInfo.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\MdConstant.cs" />
+ <Compile Include="$(BclSourcesRoot)\System\Reflection\MdFieldInfo.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\MdImport.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\MemberFilter.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\MemberInfo.Internal.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\MethodInfo.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\Missing.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\Module.cs" />
+ <Compile Include="$(BclSourcesRoot)\System\Reflection\ModuleResolveEventHandler.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\MethodBody.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\ParameterAttributes.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\ParameterInfo.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\ParameterModifier.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\Pointer.cs" />
+ <Compile Include="$(BclSourcesRoot)\System\Reflection\PortableExecutableKinds.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\PropertyAttributes.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\PropertyInfo.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\ReflectionContext.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\ReflectionTypeLoadException.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\ResourceAttributes.cs" />
+ <Compile Include="$(BclSourcesRoot)\System\Reflection\RtFieldInfo.cs" />
+ <Compile Include="$(BclSourcesRoot)\System\Reflection\RuntimeAssembly.cs" />
+ <Compile Include="$(BclSourcesRoot)\System\Reflection\RuntimeConstructorInfo.cs" />
+ <Compile Include="$(BclSourcesRoot)\System\Reflection\RuntimeEventInfo.cs" />
+ <Compile Include="$(BclSourcesRoot)\System\Reflection\RuntimeFieldInfo.cs" />
+ <Compile Include="$(BclSourcesRoot)\System\Reflection\RuntimeMethodInfo.cs" />
+ <Compile Include="$(BclSourcesRoot)\System\Reflection\RuntimeModule.cs" />
+ <Compile Include="$(BclSourcesRoot)\System\Reflection\RuntimeParameterInfo.cs" />
+ <Compile Include="$(BclSourcesRoot)\System\Reflection\RuntimePropertyInfo.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\StrongNameKeyPair.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\TargetException.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\TargetInvocationException.cs" />
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
-/*=============================================================================
-**
-**
-**
-**
-**
-**
-** Purpose: For Assembly-related stuff.
-**
-**
-=============================================================================*/
+using System.Collections.Generic;
+using CultureInfo = System.Globalization.CultureInfo;
+using System.Security;
+using System.Security.Policy;
+using System.IO;
+using System.Configuration.Assemblies;
+using StackCrawlMark = System.Threading.StackCrawlMark;
+using System.Runtime.Serialization;
+using System.Diagnostics.Contracts;
+using System.Runtime.Loader;
namespace System.Reflection
{
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using CultureInfo = System.Globalization.CultureInfo;
- using System.Security;
- using System.Security.Policy;
- using System.IO;
- using StringBuilder = System.Text.StringBuilder;
- using System.Configuration.Assemblies;
- using StackCrawlMark = System.Threading.StackCrawlMark;
- using System.Runtime.InteropServices;
- using System.Runtime.CompilerServices;
- using System.Runtime.Serialization;
- using Microsoft.Win32;
- using System.Threading;
- using __HResults = System.__HResults;
- using System.Runtime.Versioning;
- using System.Diagnostics.Contracts;
- using System.Runtime.Loader;
-
- [Serializable]
- public delegate Module ModuleResolveEventHandler(Object sender, ResolveEventArgs e);
-
-
[Serializable]
public abstract class Assembly : ICustomAttributeProvider, ISerializable
{
#endregion // public methods
}
-
- [Serializable]
- internal class RuntimeAssembly : Assembly
- {
-#if FEATURE_APPX
- // The highest byte is the flags and the lowest 3 bytes are
- // the cached ctor token of [DynamicallyInvocableAttribute].
- private enum ASSEMBLY_FLAGS : uint
- {
- ASSEMBLY_FLAGS_UNKNOWN = 0x00000000,
- ASSEMBLY_FLAGS_INITIALIZED = 0x01000000,
- ASSEMBLY_FLAGS_FRAMEWORK = 0x02000000,
- ASSEMBLY_FLAGS_TOKEN_MASK = 0x00FFFFFF,
- }
-#endif // FEATURE_APPX
-
- private const uint COR_E_LOADING_REFERENCE_ASSEMBLY = 0x80131058U;
-
- internal RuntimeAssembly() { throw new NotSupportedException(); }
-
- #region private data members
- private event ModuleResolveEventHandler _ModuleResolve;
- private string m_fullname;
- private object m_syncRoot; // Used to keep collectible types alive and as the syncroot for reflection.emit
- private IntPtr m_assembly; // slack for ptr datum on unmanaged side
-
-#if FEATURE_APPX
- private ASSEMBLY_FLAGS m_flags;
-#endif
- #endregion
-
-#if FEATURE_APPX
- private ASSEMBLY_FLAGS Flags
- {
- get
- {
- if ((m_flags & ASSEMBLY_FLAGS.ASSEMBLY_FLAGS_INITIALIZED) == 0)
- {
- ASSEMBLY_FLAGS flags = ASSEMBLY_FLAGS.ASSEMBLY_FLAGS_UNKNOWN
- | ASSEMBLY_FLAGS.ASSEMBLY_FLAGS_FRAMEWORK;
-
- m_flags = flags | ASSEMBLY_FLAGS.ASSEMBLY_FLAGS_INITIALIZED;
- }
-
- return m_flags;
- }
- }
-#endif // FEATURE_APPX
-
- internal object SyncRoot
- {
- get
- {
- if (m_syncRoot == null)
- {
- Interlocked.CompareExchange<object>(ref m_syncRoot, new object(), null);
- }
- return m_syncRoot;
- }
- }
-
- public override event ModuleResolveEventHandler ModuleResolve
- {
- add
- {
- _ModuleResolve += value;
- }
- remove
- {
- _ModuleResolve -= value;
- }
- }
-
- private const String s_localFilePrefix = "file:";
-
- [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
- [SuppressUnmanagedCodeSecurity]
- private static extern void GetCodeBase(RuntimeAssembly assembly,
- bool copiedName,
- StringHandleOnStack retString);
-
- internal String GetCodeBase(bool copiedName)
- {
- String codeBase = null;
- GetCodeBase(GetNativeHandle(), copiedName, JitHelpers.GetStringHandleOnStack(ref codeBase));
- return codeBase;
- }
-
- public override String CodeBase
- {
- get
- {
- String codeBase = GetCodeBase(false);
- return codeBase;
- }
- }
-
- internal RuntimeAssembly GetNativeHandle()
- {
- return this;
- }
-
- // If the assembly is copied before it is loaded, the codebase will be set to the
- // actual file loaded if copiedName is true. If it is false, then the original code base
- // is returned.
- public override AssemblyName GetName(bool copiedName)
- {
- AssemblyName an = new AssemblyName();
-
- String codeBase = GetCodeBase(copiedName);
-
- an.Init(GetSimpleName(),
- GetPublicKey(),
- null, // public key token
- GetVersion(),
- GetLocale(),
- GetHashAlgorithm(),
- AssemblyVersionCompatibility.SameMachine,
- codeBase,
- GetFlags() | AssemblyNameFlags.PublicKey,
- null); // strong name key pair
-
- PortableExecutableKinds pek;
- ImageFileMachine ifm;
-
- Module manifestModule = ManifestModule;
- if (manifestModule != null)
- {
- if (manifestModule.MDStreamVersion > 0x10000)
- {
- ManifestModule.GetPEKind(out pek, out ifm);
- an.SetProcArchIndex(pek, ifm);
- }
- }
- return an;
- }
-
- [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
- [SuppressUnmanagedCodeSecurity]
- private extern static void GetFullName(RuntimeAssembly assembly, StringHandleOnStack retString);
-
- public override String FullName
- {
- get
- {
- // If called by Object.ToString(), return val may be NULL.
- if (m_fullname == null)
- {
- string s = null;
- GetFullName(GetNativeHandle(), JitHelpers.GetStringHandleOnStack(ref s));
- Interlocked.CompareExchange<string>(ref m_fullname, s, null);
- }
-
- return m_fullname;
- }
- }
-
- [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
- [SuppressUnmanagedCodeSecurity]
- private static extern void GetEntryPoint(RuntimeAssembly assembly, ObjectHandleOnStack retMethod);
-
- public override MethodInfo EntryPoint
- {
- get
- {
- IRuntimeMethodInfo methodHandle = null;
- GetEntryPoint(GetNativeHandle(), JitHelpers.GetObjectHandleOnStack(ref methodHandle));
-
- if (methodHandle == null)
- return null;
-
- return (MethodInfo)RuntimeType.GetMethodBase(methodHandle);
- }
- }
-
- [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
- [SuppressUnmanagedCodeSecurity]
- private static extern void GetType(RuntimeAssembly assembly,
- String name,
- bool throwOnError,
- bool ignoreCase,
- ObjectHandleOnStack type,
- ObjectHandleOnStack keepAlive);
-
- public override Type GetType(String name, bool throwOnError, bool ignoreCase)
- {
- // throw on null strings regardless of the value of "throwOnError"
- if (name == null)
- throw new ArgumentNullException(nameof(name));
-
- RuntimeType type = null;
- Object keepAlive = null;
- GetType(GetNativeHandle(), name, throwOnError, ignoreCase, JitHelpers.GetObjectHandleOnStack(ref type), JitHelpers.GetObjectHandleOnStack(ref keepAlive));
- GC.KeepAlive(keepAlive);
-
- return type;
- }
-
- [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
- [SuppressUnmanagedCodeSecurity]
- private extern static void GetExportedTypes(RuntimeAssembly assembly, ObjectHandleOnStack retTypes);
-
- public override Type[] GetExportedTypes()
- {
- Type[] types = null;
- GetExportedTypes(GetNativeHandle(), JitHelpers.GetObjectHandleOnStack(ref types));
- return types;
- }
-
- public override IEnumerable<TypeInfo> DefinedTypes
- {
- get
- {
- List<RuntimeType> rtTypes = new List<RuntimeType>();
-
- RuntimeModule[] modules = GetModulesInternal(true, false);
-
- for (int i = 0; i < modules.Length; i++)
- {
- rtTypes.AddRange(modules[i].GetDefinedTypes());
- }
-
- return rtTypes.ToArray();
- }
- }
-
- // Load a resource based on the NameSpace of the type.
- [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod
- public override Stream GetManifestResourceStream(Type type, String name)
- {
- StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
- return GetManifestResourceStream(type, name, false, ref stackMark);
- }
-
- [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod
- public override Stream GetManifestResourceStream(String name)
- {
- StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
- return GetManifestResourceStream(name, ref stackMark, false);
- }
-
- // ISerializable implementation
- public override void GetObjectData(SerializationInfo info, StreamingContext context)
- {
- if (info == null)
- throw new ArgumentNullException(nameof(info));
-
- Contract.EndContractBlock();
-
- UnitySerializationHolder.GetUnitySerializationInfo(info,
- UnitySerializationHolder.AssemblyUnity,
- this.FullName,
- this);
- }
-
- public override Module ManifestModule
- {
- get
- {
- // We don't need to return the "external" ModuleBuilder because
- // it is meant to be read-only
- return RuntimeAssembly.GetManifestModule(GetNativeHandle());
- }
- }
-
- public override Object[] GetCustomAttributes(bool inherit)
- {
- return CustomAttribute.GetCustomAttributes(this, typeof(object) as RuntimeType);
- }
-
- public override Object[] GetCustomAttributes(Type attributeType, bool inherit)
- {
- if (attributeType == null)
- throw new ArgumentNullException(nameof(attributeType));
- Contract.EndContractBlock();
-
- RuntimeType attributeRuntimeType = attributeType.UnderlyingSystemType as RuntimeType;
-
- if (attributeRuntimeType == null)
- throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"), nameof(attributeType));
-
- return CustomAttribute.GetCustomAttributes(this, attributeRuntimeType);
- }
-
- public override bool IsDefined(Type attributeType, bool inherit)
- {
- if (attributeType == null)
- throw new ArgumentNullException(nameof(attributeType));
- Contract.EndContractBlock();
-
- RuntimeType attributeRuntimeType = attributeType.UnderlyingSystemType as RuntimeType;
-
- if (attributeRuntimeType == null)
- throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"), nameof(attributeType));
-
- return CustomAttribute.IsDefined(this, attributeRuntimeType);
- }
-
- public override IList<CustomAttributeData> GetCustomAttributesData()
- {
- return CustomAttributeData.GetCustomAttributesInternal(this);
- }
-
- [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod
- internal static RuntimeAssembly InternalLoadFrom(String assemblyFile,
- Evidence securityEvidence,
- byte[] hashValue,
- AssemblyHashAlgorithm hashAlgorithm,
- bool forIntrospection,
- ref StackCrawlMark stackMark)
- {
- if (assemblyFile == null)
- throw new ArgumentNullException(nameof(assemblyFile));
-
- Contract.EndContractBlock();
-
- AssemblyName an = new AssemblyName();
- an.CodeBase = assemblyFile;
- an.SetHashControl(hashValue, hashAlgorithm);
- // The stack mark is used for MDA filtering
- return InternalLoadAssemblyName(an, securityEvidence, null, ref stackMark, true /*thrownOnFileNotFound*/, forIntrospection);
- }
-
- // Wrapper function to wrap the typical use of InternalLoad.
- internal static RuntimeAssembly InternalLoad(String assemblyString,
- Evidence assemblySecurity,
- ref StackCrawlMark stackMark,
- bool forIntrospection)
- {
- return InternalLoad(assemblyString, assemblySecurity, ref stackMark, IntPtr.Zero, forIntrospection);
- }
-
- [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod
- internal static RuntimeAssembly InternalLoad(String assemblyString,
- Evidence assemblySecurity,
- ref StackCrawlMark stackMark,
- IntPtr pPrivHostBinder,
- bool forIntrospection)
- {
- RuntimeAssembly assembly;
- AssemblyName an = CreateAssemblyName(assemblyString, forIntrospection, out assembly);
-
- if (assembly != null)
- {
- // The assembly was returned from ResolveAssemblyEvent
- return assembly;
- }
-
- return InternalLoadAssemblyName(an, assemblySecurity, null, ref stackMark,
- pPrivHostBinder,
- true /*thrownOnFileNotFound*/, forIntrospection);
- }
-
- // Creates AssemblyName. Fills assembly if AssemblyResolve event has been raised.
- internal static AssemblyName CreateAssemblyName(
- String assemblyString,
- bool forIntrospection,
- out RuntimeAssembly assemblyFromResolveEvent)
- {
- if (assemblyString == null)
- throw new ArgumentNullException(nameof(assemblyString));
- Contract.EndContractBlock();
-
- if ((assemblyString.Length == 0) ||
- (assemblyString[0] == '\0'))
- throw new ArgumentException(Environment.GetResourceString("Format_StringZeroLength"));
-
- if (forIntrospection)
- AppDomain.CheckReflectionOnlyLoadSupported();
-
- AssemblyName an = new AssemblyName();
-
- an.Name = assemblyString;
- an.nInit(out assemblyFromResolveEvent, forIntrospection, true);
-
- return an;
- }
-
- // Wrapper function to wrap the typical use of InternalLoadAssemblyName.
- internal static RuntimeAssembly InternalLoadAssemblyName(
- AssemblyName assemblyRef,
- Evidence assemblySecurity,
- RuntimeAssembly reqAssembly,
- ref StackCrawlMark stackMark,
- bool throwOnFileNotFound,
- bool forIntrospection,
- IntPtr ptrLoadContextBinder = default(IntPtr))
- {
- return InternalLoadAssemblyName(assemblyRef, assemblySecurity, reqAssembly, ref stackMark, IntPtr.Zero, true /*throwOnError*/, forIntrospection, ptrLoadContextBinder);
- }
-
- internal static RuntimeAssembly InternalLoadAssemblyName(
- AssemblyName assemblyRef,
- Evidence assemblySecurity,
- RuntimeAssembly reqAssembly,
- ref StackCrawlMark stackMark,
- IntPtr pPrivHostBinder,
- bool throwOnFileNotFound,
- bool forIntrospection,
- IntPtr ptrLoadContextBinder = default(IntPtr))
- {
- if (assemblyRef == null)
- throw new ArgumentNullException(nameof(assemblyRef));
- Contract.EndContractBlock();
-
- if (assemblyRef.CodeBase != null)
- {
- AppDomain.CheckLoadFromSupported();
- }
-
- assemblyRef = (AssemblyName)assemblyRef.Clone();
- if (!forIntrospection &&
- (assemblyRef.ProcessorArchitecture != ProcessorArchitecture.None))
- {
- // PA does not have a semantics for by-name binds for execution
- assemblyRef.ProcessorArchitecture = ProcessorArchitecture.None;
- }
-
- String codeBase = VerifyCodeBase(assemblyRef.CodeBase);
-
- return nLoad(assemblyRef, codeBase, assemblySecurity, reqAssembly, ref stackMark,
- pPrivHostBinder,
- throwOnFileNotFound, forIntrospection, ptrLoadContextBinder);
- }
-
- // These are the framework assemblies that does reflection invocation
- // on behalf of user code. We allow framework code to invoke non-W8P
- // framework APIs but don't want user code to gain that privilege
- // through these assemblies. So we blaklist them.
- private static string[] s_unsafeFrameworkAssemblyNames = new string[] {
- "System.Reflection.Context",
- "Microsoft.VisualBasic"
- };
-
-#if FEATURE_APPX
- internal bool IsFrameworkAssembly()
- {
- ASSEMBLY_FLAGS flags = Flags;
- return (flags & ASSEMBLY_FLAGS.ASSEMBLY_FLAGS_FRAMEWORK) != 0;
- }
-#endif
-
- [MethodImplAttribute(MethodImplOptions.InternalCall)]
- private static extern RuntimeAssembly _nLoad(AssemblyName fileName,
- String codeBase,
- Evidence assemblySecurity,
- RuntimeAssembly locationHint,
- ref StackCrawlMark stackMark,
- IntPtr pPrivHostBinder,
- bool throwOnFileNotFound,
- bool forIntrospection,
- bool suppressSecurityChecks,
- IntPtr ptrLoadContextBinder);
-
- private static RuntimeAssembly nLoad(AssemblyName fileName,
- String codeBase,
- Evidence assemblySecurity,
- RuntimeAssembly locationHint,
- ref StackCrawlMark stackMark,
- IntPtr pPrivHostBinder,
- bool throwOnFileNotFound,
- bool forIntrospection,
- IntPtr ptrLoadContextBinder = default(IntPtr))
- {
- return _nLoad(fileName, codeBase, assemblySecurity, locationHint, ref stackMark,
- pPrivHostBinder,
- throwOnFileNotFound, forIntrospection, true /* suppressSecurityChecks */, ptrLoadContextBinder);
- }
-
- [MethodImplAttribute(MethodImplOptions.InternalCall)]
- private static extern bool IsReflectionOnly(RuntimeAssembly assembly);
-
- public override bool ReflectionOnly
- {
- get
- {
- return IsReflectionOnly(GetNativeHandle());
- }
- }
-
- // Returns the module in this assembly with name 'name'
-
- [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
- [SuppressUnmanagedCodeSecurity]
- private static extern void GetModule(RuntimeAssembly assembly, String name, ObjectHandleOnStack retModule);
-
- public override Module GetModule(String name)
- {
- Module retModule = null;
- GetModule(GetNativeHandle(), name, JitHelpers.GetObjectHandleOnStack(ref retModule));
- return retModule;
- }
-
- // Returns the file in the File table of the manifest that matches the
- // given name. (Name should not include path.)
- public override FileStream GetFile(String name)
- {
- RuntimeModule m = (RuntimeModule)GetModule(name);
- if (m == null)
- return null;
-
- return new FileStream(m.GetFullyQualifiedName(),
- FileMode.Open,
- FileAccess.Read, FileShare.Read, FileStream.DefaultBufferSize, false);
- }
-
- public override FileStream[] GetFiles(bool getResourceModules)
- {
- Module[] m = GetModules(getResourceModules);
- FileStream[] fs = new FileStream[m.Length];
-
- for (int i = 0; i < fs.Length; i++)
- {
- fs[i] = new FileStream(((RuntimeModule)m[i]).GetFullyQualifiedName(),
- FileMode.Open,
- FileAccess.Read, FileShare.Read, FileStream.DefaultBufferSize, false);
- }
-
- return fs;
- }
-
- // Returns the names of all the resources
- [MethodImplAttribute(MethodImplOptions.InternalCall)]
- private static extern String[] GetManifestResourceNames(RuntimeAssembly assembly);
-
- // Returns the names of all the resources
- public override String[] GetManifestResourceNames()
- {
- return GetManifestResourceNames(GetNativeHandle());
- }
-
- [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
- [SuppressUnmanagedCodeSecurity]
- private extern static void GetExecutingAssembly(StackCrawlMarkHandle stackMark, ObjectHandleOnStack retAssembly);
-
- internal static RuntimeAssembly GetExecutingAssembly(ref StackCrawlMark stackMark)
- {
- RuntimeAssembly retAssembly = null;
- GetExecutingAssembly(JitHelpers.GetStackCrawlMarkHandle(ref stackMark), JitHelpers.GetObjectHandleOnStack(ref retAssembly));
- return retAssembly;
- }
-
- // Returns the names of all the resources
- [MethodImplAttribute(MethodImplOptions.InternalCall)]
- private static extern AssemblyName[] GetReferencedAssemblies(RuntimeAssembly assembly);
-
- public override AssemblyName[] GetReferencedAssemblies()
- {
- return GetReferencedAssemblies(GetNativeHandle());
- }
-
- [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
- [SuppressUnmanagedCodeSecurity]
- private static extern int GetManifestResourceInfo(RuntimeAssembly assembly,
- String resourceName,
- ObjectHandleOnStack assemblyRef,
- StringHandleOnStack retFileName,
- StackCrawlMarkHandle stackMark);
-
- [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod
- public override ManifestResourceInfo GetManifestResourceInfo(String resourceName)
- {
- RuntimeAssembly retAssembly = null;
- String fileName = null;
- StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
- int location = GetManifestResourceInfo(GetNativeHandle(), resourceName,
- JitHelpers.GetObjectHandleOnStack(ref retAssembly),
- JitHelpers.GetStringHandleOnStack(ref fileName),
- JitHelpers.GetStackCrawlMarkHandle(ref stackMark));
-
- if (location == -1)
- return null;
-
- return new ManifestResourceInfo(retAssembly, fileName,
- (ResourceLocation)location);
- }
-
- [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
- [SuppressUnmanagedCodeSecurity]
- private static extern void GetLocation(RuntimeAssembly assembly, StringHandleOnStack retString);
-
- public override String Location
- {
- get
- {
- String location = null;
-
- GetLocation(GetNativeHandle(), JitHelpers.GetStringHandleOnStack(ref location));
-
- return location;
- }
- }
-
- [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
- [SuppressUnmanagedCodeSecurity]
- private extern static void GetImageRuntimeVersion(RuntimeAssembly assembly, StringHandleOnStack retString);
-
- public override String ImageRuntimeVersion
- {
- get
- {
- String s = null;
- GetImageRuntimeVersion(GetNativeHandle(), JitHelpers.GetStringHandleOnStack(ref s));
- return s;
- }
- }
-
- public override bool GlobalAssemblyCache
- {
- get
- {
- return false;
- }
- }
-
- public override Int64 HostContext
- {
- get
- {
- return 0;
- }
- }
-
- private static String VerifyCodeBase(String codebase)
- {
- if (codebase == null)
- return null;
-
- int len = codebase.Length;
- if (len == 0)
- return null;
-
-
- int j = codebase.IndexOf(':');
- // Check to see if the url has a prefix
- if ((j != -1) &&
- (j + 2 < len) &&
- ((codebase[j + 1] == '/') || (codebase[j + 1] == '\\')) &&
- ((codebase[j + 2] == '/') || (codebase[j + 2] == '\\')))
- return codebase;
-#if !PLATFORM_UNIX
- else if ((len > 2) && (codebase[0] == '\\') && (codebase[1] == '\\'))
- return "file://" + codebase;
- else
- return "file:///" + Path.GetFullPath(codebase);
-#else
- else
- return "file://" + Path.GetFullPath(codebase);
-#endif // !PLATFORM_UNIX
- }
-
- internal Stream GetManifestResourceStream(
- Type type,
- String name,
- bool skipSecurityCheck,
- ref StackCrawlMark stackMark)
- {
- StringBuilder sb = new StringBuilder();
- if (type == null)
- {
- if (name == null)
- throw new ArgumentNullException(nameof(type));
- }
- else
- {
- String nameSpace = type.Namespace;
- if (nameSpace != null)
- {
- sb.Append(nameSpace);
- if (name != null)
- sb.Append(Type.Delimiter);
- }
- }
-
- if (name != null)
- sb.Append(name);
-
- return GetManifestResourceStream(sb.ToString(), ref stackMark, skipSecurityCheck);
- }
-
- // GetResource will return a pointer to the resources in memory.
- [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
- [SuppressUnmanagedCodeSecurity]
- private static unsafe extern byte* GetResource(RuntimeAssembly assembly,
- String resourceName,
- out ulong length,
- StackCrawlMarkHandle stackMark,
- bool skipSecurityCheck);
-
- internal unsafe Stream GetManifestResourceStream(String name, ref StackCrawlMark stackMark, bool skipSecurityCheck)
- {
- ulong length = 0;
- byte* pbInMemoryResource = GetResource(GetNativeHandle(), name, out length, JitHelpers.GetStackCrawlMarkHandle(ref stackMark), skipSecurityCheck);
-
- if (pbInMemoryResource != null)
- {
- //Console.WriteLine("Creating an unmanaged memory stream of length "+length);
- if (length > Int64.MaxValue)
- throw new NotImplementedException(Environment.GetResourceString("NotImplemented_ResourcesLongerThan2^63"));
-
- return new UnmanagedMemoryStream(pbInMemoryResource, (long)length, (long)length, FileAccess.Read);
- }
-
- //Console.WriteLine("GetManifestResourceStream: Blob "+name+" not found...");
- return null;
- }
-
- [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
- [SuppressUnmanagedCodeSecurity]
- private static extern void GetVersion(RuntimeAssembly assembly,
- out int majVer,
- out int minVer,
- out int buildNum,
- out int revNum);
-
- internal Version GetVersion()
- {
- int majorVer, minorVer, build, revision;
- GetVersion(GetNativeHandle(), out majorVer, out minorVer, out build, out revision);
- return new Version(majorVer, minorVer, build, revision);
- }
-
- [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
- [SuppressUnmanagedCodeSecurity]
- private static extern void GetLocale(RuntimeAssembly assembly, StringHandleOnStack retString);
-
- internal CultureInfo GetLocale()
- {
- String locale = null;
-
- GetLocale(GetNativeHandle(), JitHelpers.GetStringHandleOnStack(ref locale));
-
- if (locale == null)
- return CultureInfo.InvariantCulture;
-
- return new CultureInfo(locale);
- }
-
- [MethodImplAttribute(MethodImplOptions.InternalCall)]
- private static extern bool FCallIsDynamic(RuntimeAssembly assembly);
-
- public override bool IsDynamic
- {
- get
- {
- return FCallIsDynamic(GetNativeHandle());
- }
- }
-
- [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
- [SuppressUnmanagedCodeSecurity]
- private static extern void GetSimpleName(RuntimeAssembly assembly, StringHandleOnStack retSimpleName);
-
- internal String GetSimpleName()
- {
- string name = null;
- GetSimpleName(GetNativeHandle(), JitHelpers.GetStringHandleOnStack(ref name));
- return name;
- }
-
- [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
- [SuppressUnmanagedCodeSecurity]
- private extern static AssemblyHashAlgorithm GetHashAlgorithm(RuntimeAssembly assembly);
-
- private AssemblyHashAlgorithm GetHashAlgorithm()
- {
- return GetHashAlgorithm(GetNativeHandle());
- }
-
- [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
- [SuppressUnmanagedCodeSecurity]
- private extern static AssemblyNameFlags GetFlags(RuntimeAssembly assembly);
-
- private AssemblyNameFlags GetFlags()
- {
- return GetFlags(GetNativeHandle());
- }
-
- [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
- [SuppressUnmanagedCodeSecurity]
- private static extern void GetPublicKey(RuntimeAssembly assembly, ObjectHandleOnStack retPublicKey);
-
- internal byte[] GetPublicKey()
- {
- byte[] publicKey = null;
- GetPublicKey(GetNativeHandle(), JitHelpers.GetObjectHandleOnStack(ref publicKey));
- return publicKey;
- }
-
- [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
- [SuppressUnmanagedCodeSecurity]
- [return: MarshalAs(UnmanagedType.Bool)]
- private extern static bool IsAllSecurityTransparent(RuntimeAssembly assembly);
-
- // Is everything introduced by this assembly transparent
- internal bool IsAllSecurityTransparent()
- {
- return IsAllSecurityTransparent(GetNativeHandle());
- }
-
- // This method is called by the VM.
- private RuntimeModule OnModuleResolveEvent(String moduleName)
- {
- ModuleResolveEventHandler moduleResolve = _ModuleResolve;
- if (moduleResolve == null)
- return null;
-
- Delegate[] ds = moduleResolve.GetInvocationList();
- int len = ds.Length;
- for (int i = 0; i < len; i++)
- {
- RuntimeModule ret = (RuntimeModule)((ModuleResolveEventHandler)ds[i])(this, new ResolveEventArgs(moduleName, this));
- if (ret != null)
- return ret;
- }
-
- return null;
- }
-
- [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod
- public override Assembly GetSatelliteAssembly(CultureInfo culture)
- {
- StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
- return InternalGetSatelliteAssembly(culture, null, ref stackMark);
- }
-
- // Useful for binding to a very specific version of a satellite assembly
- [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod
- public override Assembly GetSatelliteAssembly(CultureInfo culture, Version version)
- {
- StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
- return InternalGetSatelliteAssembly(culture, version, ref stackMark);
- }
-
- [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod
- internal Assembly InternalGetSatelliteAssembly(CultureInfo culture,
- Version version,
- ref StackCrawlMark stackMark)
- {
- if (culture == null)
- throw new ArgumentNullException(nameof(culture));
- Contract.EndContractBlock();
-
-
- String name = GetSimpleName() + ".resources";
- return InternalGetSatelliteAssembly(name, culture, version, true, ref stackMark);
- }
-
- [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod
- internal RuntimeAssembly InternalGetSatelliteAssembly(String name,
- CultureInfo culture,
- Version version,
- bool throwOnFileNotFound,
- ref StackCrawlMark stackMark)
- {
- AssemblyName an = new AssemblyName();
-
- an.SetPublicKey(GetPublicKey());
- an.Flags = GetFlags() | AssemblyNameFlags.PublicKey;
-
- if (version == null)
- an.Version = GetVersion();
- else
- an.Version = version;
-
- an.CultureInfo = culture;
- an.Name = name;
-
- RuntimeAssembly retAssembly = nLoad(an, null, null, this, ref stackMark,
- IntPtr.Zero,
- throwOnFileNotFound, false);
-
- if (retAssembly == this || (retAssembly == null && throwOnFileNotFound))
- {
- throw new FileNotFoundException(String.Format(culture, Environment.GetResourceString("IO.FileNotFound_FileName"), an.Name));
- }
-
- return retAssembly;
- }
-
- [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
- [SuppressUnmanagedCodeSecurity]
- private extern static void GetModules(RuntimeAssembly assembly,
- bool loadIfNotFound,
- bool getResourceModules,
- ObjectHandleOnStack retModuleHandles);
-
- private RuntimeModule[] GetModulesInternal(bool loadIfNotFound,
- bool getResourceModules)
- {
- RuntimeModule[] modules = null;
- GetModules(GetNativeHandle(), loadIfNotFound, getResourceModules, JitHelpers.GetObjectHandleOnStack(ref modules));
- return modules;
- }
-
- public override Module[] GetModules(bool getResourceModules)
- {
- return GetModulesInternal(true, getResourceModules);
- }
-
- public override Module[] GetLoadedModules(bool getResourceModules)
- {
- return GetModulesInternal(false, getResourceModules);
- }
-
- [MethodImplAttribute(MethodImplOptions.InternalCall)]
- internal static extern RuntimeModule GetManifestModule(RuntimeAssembly assembly);
-
- [MethodImplAttribute(MethodImplOptions.InternalCall)]
- internal static extern int GetToken(RuntimeAssembly assembly);
- }
}
--- /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.
+
+namespace System.Reflection
+{
+ public abstract partial class ConstructorInfo : MethodBase
+ {
+ internal virtual Type GetReturnType() { throw new NotImplementedException(); }
+ }
+}
// 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.Globalization;
namespace System.Reflection
{
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.Diagnostics.Contracts;
- using System.Globalization;
- using System.Runtime;
- using System.Runtime.ConstrainedExecution;
- using System.Runtime.InteropServices;
- using System.Runtime.Serialization;
- using System.Security;
- using System.Threading;
- using MemberListType = System.RuntimeType.MemberListType;
- using RuntimeTypeCache = System.RuntimeType.RuntimeTypeCache;
- using System.Runtime.CompilerServices;
-
[Serializable]
- public abstract class ConstructorInfo : MethodBase
+ public abstract partial class ConstructorInfo : MethodBase
{
#region Static Members
public readonly static String ConstructorName = ".ctor";
return base.GetHashCode();
}
- #region Internal Members
- internal virtual Type GetReturnType() { throw new NotImplementedException(); }
- #endregion
-
#region MemberInfo Overrides
public override MemberTypes MemberType { get { return System.Reflection.MemberTypes.Constructor; } }
#endregion
}
#endregion
}
-
- [Serializable]
- internal sealed class RuntimeConstructorInfo : ConstructorInfo, ISerializable, IRuntimeMethodInfo
- {
- #region Private Data Members
- private volatile RuntimeType m_declaringType;
- private RuntimeTypeCache m_reflectedTypeCache;
- private string m_toString;
- private ParameterInfo[] m_parameters = null; // Created lazily when GetParameters() is called.
-#pragma warning disable 169
- private object _empty1; // These empties are used to ensure that RuntimeConstructorInfo and RuntimeMethodInfo are have a layout which is sufficiently similar
- private object _empty2;
- private object _empty3;
-#pragma warning restore 169
- private IntPtr m_handle;
- private MethodAttributes m_methodAttributes;
- private BindingFlags m_bindingFlags;
- private volatile Signature m_signature;
- private INVOCATION_FLAGS m_invocationFlags;
-
- internal INVOCATION_FLAGS InvocationFlags
- {
- get
- {
- if ((m_invocationFlags & INVOCATION_FLAGS.INVOCATION_FLAGS_INITIALIZED) == 0)
- {
- INVOCATION_FLAGS invocationFlags = INVOCATION_FLAGS.INVOCATION_FLAGS_IS_CTOR; // this is a given
-
- Type declaringType = DeclaringType;
-
- //
- // first take care of all the NO_INVOKE cases.
- if (declaringType == typeof(void) ||
- (declaringType != null && declaringType.ContainsGenericParameters) ||
- ((CallingConvention & CallingConventions.VarArgs) == CallingConventions.VarArgs) ||
- ((Attributes & MethodAttributes.RequireSecObject) == MethodAttributes.RequireSecObject))
- {
- // We don't need other flags if this method cannot be invoked
- invocationFlags |= INVOCATION_FLAGS.INVOCATION_FLAGS_NO_INVOKE;
- }
- else if (IsStatic || declaringType != null && declaringType.IsAbstract)
- {
- invocationFlags |= INVOCATION_FLAGS.INVOCATION_FLAGS_NO_CTOR_INVOKE;
- }
- else
- {
- // this should be an invocable method, determine the other flags that participate in invocation
- invocationFlags |= RuntimeMethodHandle.GetSecurityFlags(this);
-
- if ((invocationFlags & INVOCATION_FLAGS.INVOCATION_FLAGS_NEED_SECURITY) == 0 &&
- ((Attributes & MethodAttributes.MemberAccessMask) != MethodAttributes.Public ||
- (declaringType != null && declaringType.NeedsReflectionSecurityCheck)))
- {
- // If method is non-public, or declaring type is not visible
- invocationFlags |= INVOCATION_FLAGS.INVOCATION_FLAGS_NEED_SECURITY;
- }
-
- // Check for attempt to create a delegate class, we demand unmanaged
- // code permission for this since it's hard to validate the target address.
- if (typeof(Delegate).IsAssignableFrom(DeclaringType))
- invocationFlags |= INVOCATION_FLAGS.INVOCATION_FLAGS_IS_DELEGATE_CTOR;
- }
-
- m_invocationFlags = invocationFlags | INVOCATION_FLAGS.INVOCATION_FLAGS_INITIALIZED;
- }
-
- return m_invocationFlags;
- }
- }
- #endregion
-
- #region Constructor
- internal RuntimeConstructorInfo(
- RuntimeMethodHandleInternal handle, RuntimeType declaringType, RuntimeTypeCache reflectedTypeCache,
- MethodAttributes methodAttributes, BindingFlags bindingFlags)
- {
- Contract.Ensures(methodAttributes == RuntimeMethodHandle.GetAttributes(handle));
-
- m_bindingFlags = bindingFlags;
- m_reflectedTypeCache = reflectedTypeCache;
- m_declaringType = declaringType;
- m_handle = handle.Value;
- m_methodAttributes = methodAttributes;
- }
- #endregion
-
- #region NonPublic Methods
- RuntimeMethodHandleInternal IRuntimeMethodInfo.Value
- {
- get
- {
- return new RuntimeMethodHandleInternal(m_handle);
- }
- }
-
- internal override bool CacheEquals(object o)
- {
- RuntimeConstructorInfo m = o as RuntimeConstructorInfo;
-
- if ((object)m == null)
- return false;
-
- return m.m_handle == m_handle;
- }
-
- private Signature Signature
- {
- get
- {
- if (m_signature == null)
- m_signature = new Signature(this, m_declaringType);
-
- return m_signature;
- }
- }
-
- private RuntimeType ReflectedTypeInternal
- {
- get
- {
- return m_reflectedTypeCache.GetRuntimeType();
- }
- }
-
- private void CheckConsistency(Object target)
- {
- if (target == null && IsStatic)
- return;
-
- if (!m_declaringType.IsInstanceOfType(target))
- {
- if (target == null)
- throw new TargetException(Environment.GetResourceString("RFLCT.Targ_StatMethReqTarg"));
-
- throw new TargetException(Environment.GetResourceString("RFLCT.Targ_ITargMismatch"));
- }
- }
-
- internal BindingFlags BindingFlags { get { return m_bindingFlags; } }
- #endregion
-
- #region Object Overrides
- public override String ToString()
- {
- // "Void" really doesn't make sense here. But we'll keep it for compat reasons.
- if (m_toString == null)
- m_toString = "Void " + FormatNameAndSig();
-
- return m_toString;
- }
- #endregion
-
- #region ICustomAttributeProvider
- public override Object[] GetCustomAttributes(bool inherit)
- {
- return CustomAttribute.GetCustomAttributes(this, typeof(object) as RuntimeType);
- }
-
- public override Object[] GetCustomAttributes(Type attributeType, bool inherit)
- {
- if (attributeType == null)
- throw new ArgumentNullException(nameof(attributeType));
- Contract.EndContractBlock();
-
- RuntimeType attributeRuntimeType = attributeType.UnderlyingSystemType as RuntimeType;
-
- if (attributeRuntimeType == null)
- throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"), nameof(attributeType));
-
- return CustomAttribute.GetCustomAttributes(this, attributeRuntimeType);
- }
-
- public override bool IsDefined(Type attributeType, bool inherit)
- {
- if (attributeType == null)
- throw new ArgumentNullException(nameof(attributeType));
- Contract.EndContractBlock();
-
- RuntimeType attributeRuntimeType = attributeType.UnderlyingSystemType as RuntimeType;
-
- if (attributeRuntimeType == null)
- throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"), nameof(attributeType));
-
- return CustomAttribute.IsDefined(this, attributeRuntimeType);
- }
-
- public override IList<CustomAttributeData> GetCustomAttributesData()
- {
- return CustomAttributeData.GetCustomAttributesInternal(this);
- }
- #endregion
-
-
- #region MemberInfo Overrides
- public override String Name
- {
- get { return RuntimeMethodHandle.GetName(this); }
- }
- public override MemberTypes MemberType { get { return MemberTypes.Constructor; } }
-
- public override Type DeclaringType
- {
- get
- {
- return m_reflectedTypeCache.IsGlobal ? null : m_declaringType;
- }
- }
-
- public override Type ReflectedType
- {
- get
- {
- return m_reflectedTypeCache.IsGlobal ? null : ReflectedTypeInternal;
- }
- }
-
- public override int MetadataToken
- {
- get { return RuntimeMethodHandle.GetMethodDef(this); }
- }
- public override Module Module
- {
- get { return GetRuntimeModule(); }
- }
-
- internal RuntimeType GetRuntimeType() { return m_declaringType; }
- internal RuntimeModule GetRuntimeModule() { return RuntimeTypeHandle.GetModule(m_declaringType); }
- internal RuntimeAssembly GetRuntimeAssembly() { return GetRuntimeModule().GetRuntimeAssembly(); }
- #endregion
-
- #region MethodBase Overrides
-
- // This seems to always returns System.Void.
- internal override Type GetReturnType() { return Signature.ReturnType; }
-
- internal override ParameterInfo[] GetParametersNoCopy()
- {
- if (m_parameters == null)
- m_parameters = RuntimeParameterInfo.GetParameters(this, this, Signature);
-
- return m_parameters;
- }
-
- [Pure]
- public override ParameterInfo[] GetParameters()
- {
- ParameterInfo[] parameters = GetParametersNoCopy();
-
- if (parameters.Length == 0)
- return parameters;
-
- ParameterInfo[] ret = new ParameterInfo[parameters.Length];
- Array.Copy(parameters, ret, parameters.Length);
- return ret;
- }
-
- public override MethodImplAttributes GetMethodImplementationFlags()
- {
- return RuntimeMethodHandle.GetImplAttributes(this);
- }
-
- public override RuntimeMethodHandle MethodHandle
- {
- get
- {
- Type declaringType = DeclaringType;
- if ((declaringType == null && Module.Assembly.ReflectionOnly) || declaringType is ReflectionOnlyType)
- throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_NotAllowedInReflectionOnly"));
- return new RuntimeMethodHandle(this);
- }
- }
-
- public override MethodAttributes Attributes
- {
- get
- {
- return m_methodAttributes;
- }
- }
-
- public override CallingConventions CallingConvention
- {
- get
- {
- return Signature.CallingConvention;
- }
- }
-
- internal static void CheckCanCreateInstance(Type declaringType, bool isVarArg)
- {
- if (declaringType == null)
- throw new ArgumentNullException(nameof(declaringType));
- Contract.EndContractBlock();
-
- // ctor is ReflectOnly
- if (declaringType is ReflectionOnlyType)
- throw new InvalidOperationException(Environment.GetResourceString("Arg_ReflectionOnlyInvoke"));
-
- // ctor is declared on interface class
- else if (declaringType.IsInterface)
- throw new MemberAccessException(
- String.Format(CultureInfo.CurrentUICulture, Environment.GetResourceString("Acc_CreateInterfaceEx"), declaringType));
-
- // ctor is on an abstract class
- else if (declaringType.IsAbstract)
- throw new MemberAccessException(
- String.Format(CultureInfo.CurrentUICulture, Environment.GetResourceString("Acc_CreateAbstEx"), declaringType));
-
- // ctor is on a class that contains stack pointers
- else if (declaringType.GetRootElementType() == typeof(ArgIterator))
- throw new NotSupportedException();
-
- // ctor is vararg
- else if (isVarArg)
- throw new NotSupportedException();
-
- // ctor is generic or on a generic class
- else if (declaringType.ContainsGenericParameters)
- {
- throw new MemberAccessException(
- String.Format(CultureInfo.CurrentUICulture, Environment.GetResourceString("Acc_CreateGenericEx"), declaringType));
- }
-
- // ctor is declared on System.Void
- else if (declaringType == typeof(void))
- throw new MemberAccessException(Environment.GetResourceString("Access_Void"));
- }
-
- internal void ThrowNoInvokeException()
- {
- CheckCanCreateInstance(DeclaringType, (CallingConvention & CallingConventions.VarArgs) == CallingConventions.VarArgs);
-
- // ctor is .cctor
- if ((Attributes & MethodAttributes.Static) == MethodAttributes.Static)
- throw new MemberAccessException(Environment.GetResourceString("Acc_NotClassInit"));
-
- throw new TargetException();
- }
-
- [DebuggerStepThroughAttribute]
- [Diagnostics.DebuggerHidden]
- [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod
- public override Object Invoke(
- Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
- {
- INVOCATION_FLAGS invocationFlags = InvocationFlags;
-
- if ((invocationFlags & INVOCATION_FLAGS.INVOCATION_FLAGS_NO_INVOKE) != 0)
- ThrowNoInvokeException();
-
- // check basic method consistency. This call will throw if there are problems in the target/method relationship
- CheckConsistency(obj);
-
- if (obj != null)
- {
- // For unverifiable code, we require the caller to be critical.
- // Adding the INVOCATION_FLAGS_NEED_SECURITY flag makes that check happen
- invocationFlags |= INVOCATION_FLAGS.INVOCATION_FLAGS_NEED_SECURITY;
- }
-
- Signature sig = Signature;
-
- // get the signature
- int formalCount = sig.Arguments.Length;
- int actualCount = (parameters != null) ? parameters.Length : 0;
- if (formalCount != actualCount)
- throw new TargetParameterCountException(Environment.GetResourceString("Arg_ParmCnt"));
-
- // if we are here we passed all the previous checks. Time to look at the arguments
- if (actualCount > 0)
- {
- Object[] arguments = CheckArguments(parameters, binder, invokeAttr, culture, sig);
- Object retValue = RuntimeMethodHandle.InvokeMethod(obj, arguments, sig, false);
- // copy out. This should be made only if ByRef are present.
- for (int index = 0; index < arguments.Length; index++)
- parameters[index] = arguments[index];
- return retValue;
- }
- return RuntimeMethodHandle.InvokeMethod(obj, null, sig, false);
- }
-
- public override MethodBody GetMethodBody()
- {
- MethodBody mb = RuntimeMethodHandle.GetMethodBody(this, ReflectedTypeInternal);
- if (mb != null)
- mb.m_methodBase = this;
- return mb;
- }
-
- public override bool IsSecurityCritical
- {
- get { return true; }
- }
-
- public override bool IsSecuritySafeCritical
- {
- get { return false; }
- }
-
- public override bool IsSecurityTransparent
- {
- get { return false; }
- }
-
- public override bool ContainsGenericParameters
- {
- get
- {
- return (DeclaringType != null && DeclaringType.ContainsGenericParameters);
- }
- }
- #endregion
-
- #region ConstructorInfo Overrides
- [DebuggerStepThroughAttribute]
- [Diagnostics.DebuggerHidden]
- [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod
- public override Object Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
- {
- INVOCATION_FLAGS invocationFlags = InvocationFlags;
-
- // get the declaring TypeHandle early for consistent exceptions in IntrospectionOnly context
- RuntimeTypeHandle declaringTypeHandle = m_declaringType.TypeHandle;
-
- if ((invocationFlags & (INVOCATION_FLAGS.INVOCATION_FLAGS_NO_INVOKE | INVOCATION_FLAGS.INVOCATION_FLAGS_CONTAINS_STACK_POINTERS | INVOCATION_FLAGS.INVOCATION_FLAGS_NO_CTOR_INVOKE)) != 0)
- ThrowNoInvokeException();
-
- // get the signature
- Signature sig = Signature;
-
- int formalCount = sig.Arguments.Length;
- int actualCount = (parameters != null) ? parameters.Length : 0;
- if (formalCount != actualCount)
- throw new TargetParameterCountException(Environment.GetResourceString("Arg_ParmCnt"));
-
- // We don't need to explicitly invoke the class constructor here,
- // JIT/NGen will insert the call to .cctor in the instance ctor.
-
- // if we are here we passed all the previous checks. Time to look at the arguments
- if (actualCount > 0)
- {
- Object[] arguments = CheckArguments(parameters, binder, invokeAttr, culture, sig);
- Object retValue = RuntimeMethodHandle.InvokeMethod(null, arguments, sig, true);
- // copy out. This should be made only if ByRef are present.
- for (int index = 0; index < arguments.Length; index++)
- parameters[index] = arguments[index];
- return retValue;
- }
- return RuntimeMethodHandle.InvokeMethod(null, null, sig, true);
- }
- #endregion
-
- #region ISerializable Implementation
- public void GetObjectData(SerializationInfo info, StreamingContext context)
- {
- if (info == null)
- throw new ArgumentNullException(nameof(info));
- Contract.EndContractBlock();
- MemberInfoSerializationHolder.GetSerializationInfo(
- info,
- Name,
- ReflectedTypeInternal,
- ToString(),
- SerializationToString(),
- MemberTypes.Constructor,
- null);
- }
-
- internal string SerializationToString()
- {
- // We don't need the return type for constructors.
- return FormatNameAndSig(true);
- }
- #endregion
- }
}
// 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;
namespace System.Reflection
{
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.Diagnostics.Contracts;
- using System.Runtime.InteropServices;
- using System.Runtime.Serialization;
- using System.Runtime.ConstrainedExecution;
- using RuntimeTypeCache = System.RuntimeType.RuntimeTypeCache;
-
[Serializable]
public abstract class EventInfo : MemberInfo
{
}
#endregion
}
-
- [Serializable]
- internal unsafe sealed class RuntimeEventInfo : EventInfo, ISerializable
- {
- #region Private Data Members
- private int m_token;
- private EventAttributes m_flags;
- private string m_name;
- private void* m_utf8name;
- private RuntimeTypeCache m_reflectedTypeCache;
- private RuntimeMethodInfo m_addMethod;
- private RuntimeMethodInfo m_removeMethod;
- private RuntimeMethodInfo m_raiseMethod;
- private MethodInfo[] m_otherMethod;
- private RuntimeType m_declaringType;
- private BindingFlags m_bindingFlags;
- #endregion
-
- #region Constructor
- internal RuntimeEventInfo()
- {
- // Used for dummy head node during population
- }
- internal RuntimeEventInfo(int tkEvent, RuntimeType declaredType, RuntimeTypeCache reflectedTypeCache, out bool isPrivate)
- {
- Contract.Requires(declaredType != null);
- Contract.Requires(reflectedTypeCache != null);
- Debug.Assert(!reflectedTypeCache.IsGlobal);
-
- MetadataImport scope = declaredType.GetRuntimeModule().MetadataImport;
-
- m_token = tkEvent;
- m_reflectedTypeCache = reflectedTypeCache;
- m_declaringType = declaredType;
-
-
- RuntimeType reflectedType = reflectedTypeCache.GetRuntimeType();
-
- scope.GetEventProps(tkEvent, out m_utf8name, out m_flags);
-
- RuntimeMethodInfo dummy;
- Associates.AssignAssociates(scope, tkEvent, declaredType, reflectedType,
- out m_addMethod, out m_removeMethod, out m_raiseMethod,
- out dummy, out dummy, out m_otherMethod, out isPrivate, out m_bindingFlags);
- }
- #endregion
-
- #region Internal Members
- internal override bool CacheEquals(object o)
- {
- RuntimeEventInfo m = o as RuntimeEventInfo;
-
- if ((object)m == null)
- return false;
-
- return m.m_token == m_token &&
- RuntimeTypeHandle.GetModule(m_declaringType).Equals(
- RuntimeTypeHandle.GetModule(m.m_declaringType));
- }
-
- internal BindingFlags BindingFlags { get { return m_bindingFlags; } }
- #endregion
-
- #region Object Overrides
- public override String ToString()
- {
- if (m_addMethod == null || m_addMethod.GetParametersNoCopy().Length == 0)
- throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_NoPublicAddMethod"));
-
- return m_addMethod.GetParametersNoCopy()[0].ParameterType.FormatTypeName() + " " + Name;
- }
- #endregion
-
- #region ICustomAttributeProvider
- public override Object[] GetCustomAttributes(bool inherit)
- {
- return CustomAttribute.GetCustomAttributes(this, typeof(object) as RuntimeType);
- }
-
- public override Object[] GetCustomAttributes(Type attributeType, bool inherit)
- {
- if (attributeType == null)
- throw new ArgumentNullException(nameof(attributeType));
- Contract.EndContractBlock();
-
- RuntimeType attributeRuntimeType = attributeType.UnderlyingSystemType as RuntimeType;
-
- if (attributeRuntimeType == null)
- throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"), nameof(attributeType));
-
- return CustomAttribute.GetCustomAttributes(this, attributeRuntimeType);
- }
-
- public override bool IsDefined(Type attributeType, bool inherit)
- {
- if (attributeType == null)
- throw new ArgumentNullException(nameof(attributeType));
- Contract.EndContractBlock();
-
- RuntimeType attributeRuntimeType = attributeType.UnderlyingSystemType as RuntimeType;
-
- if (attributeRuntimeType == null)
- throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"), nameof(attributeType));
-
- return CustomAttribute.IsDefined(this, attributeRuntimeType);
- }
-
- public override IList<CustomAttributeData> GetCustomAttributesData()
- {
- return CustomAttributeData.GetCustomAttributesInternal(this);
- }
- #endregion
-
- #region MemberInfo Overrides
- public override MemberTypes MemberType { get { return MemberTypes.Event; } }
- public override String Name
- {
- get
- {
- if (m_name == null)
- m_name = new Utf8String(m_utf8name).ToString();
-
- return m_name;
- }
- }
- public override Type DeclaringType { get { return m_declaringType; } }
- public override Type ReflectedType
- {
- get
- {
- return ReflectedTypeInternal;
- }
- }
-
- private RuntimeType ReflectedTypeInternal
- {
- get
- {
- return m_reflectedTypeCache.GetRuntimeType();
- }
- }
-
- public override int MetadataToken { get { return m_token; } }
- public override Module Module { get { return GetRuntimeModule(); } }
- internal RuntimeModule GetRuntimeModule() { return m_declaringType.GetRuntimeModule(); }
- #endregion
-
- #region ISerializable
- public void GetObjectData(SerializationInfo info, StreamingContext context)
- {
- if (info == null)
- throw new ArgumentNullException(nameof(info));
- Contract.EndContractBlock();
-
- MemberInfoSerializationHolder.GetSerializationInfo(
- info,
- Name,
- ReflectedTypeInternal,
- null,
- MemberTypes.Event);
- }
- #endregion
-
- #region EventInfo Overrides
- public override MethodInfo[] GetOtherMethods(bool nonPublic)
- {
- List<MethodInfo> ret = new List<MethodInfo>();
-
- if ((object)m_otherMethod == null)
- return new MethodInfo[0];
-
- for (int i = 0; i < m_otherMethod.Length; i++)
- {
- if (Associates.IncludeAccessor((MethodInfo)m_otherMethod[i], nonPublic))
- ret.Add(m_otherMethod[i]);
- }
-
- return ret.ToArray();
- }
-
- public override MethodInfo GetAddMethod(bool nonPublic)
- {
- if (!Associates.IncludeAccessor(m_addMethod, nonPublic))
- return null;
-
- return m_addMethod;
- }
-
- public override MethodInfo GetRemoveMethod(bool nonPublic)
- {
- if (!Associates.IncludeAccessor(m_removeMethod, nonPublic))
- return null;
-
- return m_removeMethod;
- }
-
- public override MethodInfo GetRaiseMethod(bool nonPublic)
- {
- if (!Associates.IncludeAccessor(m_raiseMethod, nonPublic))
- return null;
-
- return m_raiseMethod;
- }
-
- public override EventAttributes Attributes
- {
- get
- {
- return m_flags;
- }
- }
- #endregion
- }
}
--- /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.Globalization;
+
+namespace System.Reflection
+{
+ public abstract partial class FieldInfo : MemberInfo
+ {
+ public static FieldInfo GetFieldFromHandle(RuntimeFieldHandle handle)
+ {
+ if (handle.IsNullHandle())
+ throw new ArgumentException(Environment.GetResourceString("Argument_InvalidHandle"), nameof(handle));
+
+ FieldInfo f = RuntimeType.GetFieldInfo(handle.GetRuntimeFieldInfo());
+
+ Type declaringType = f.DeclaringType;
+ if (declaringType != null && declaringType.IsGenericType)
+ throw new ArgumentException(String.Format(
+ CultureInfo.CurrentCulture, Environment.GetResourceString("Argument_FieldDeclaringTypeGeneric"),
+ f.Name, declaringType.GetGenericTypeDefinition()));
+
+ return f;
+ }
+
+ public static FieldInfo GetFieldFromHandle(RuntimeFieldHandle handle, RuntimeTypeHandle declaringType)
+ {
+ if (handle.IsNullHandle())
+ throw new ArgumentException(Environment.GetResourceString("Argument_InvalidHandle"));
+
+ return RuntimeType.GetFieldInfo(declaringType.GetRuntimeType(), handle.GetRuntimeFieldInfo());
+ }
+ }
+}
// 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.Globalization;
namespace System.Reflection
{
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.Diagnostics.Contracts;
- using System.Globalization;
- using System.Runtime;
- using System.Runtime.CompilerServices;
- using System.Runtime.ConstrainedExecution;
- using System.Runtime.InteropServices;
- using System.Runtime.Serialization;
- using System.Threading;
- using RuntimeTypeCache = System.RuntimeType.RuntimeTypeCache;
-
[Serializable]
- public abstract class FieldInfo : MemberInfo
+ public abstract partial class FieldInfo : MemberInfo
{
- #region Static Members
- public static FieldInfo GetFieldFromHandle(RuntimeFieldHandle handle)
- {
- if (handle.IsNullHandle())
- throw new ArgumentException(Environment.GetResourceString("Argument_InvalidHandle"), nameof(handle));
-
- FieldInfo f = RuntimeType.GetFieldInfo(handle.GetRuntimeFieldInfo());
-
- Type declaringType = f.DeclaringType;
- if (declaringType != null && declaringType.IsGenericType)
- throw new ArgumentException(String.Format(
- CultureInfo.CurrentCulture, Environment.GetResourceString("Argument_FieldDeclaringTypeGeneric"),
- f.Name, declaringType.GetGenericTypeDefinition()));
-
- return f;
- }
-
- public static FieldInfo GetFieldFromHandle(RuntimeFieldHandle handle, RuntimeTypeHandle declaringType)
- {
- if (handle.IsNullHandle())
- throw new ArgumentException(Environment.GetResourceString("Argument_InvalidHandle"));
-
- return RuntimeType.GetFieldInfo(declaringType.GetRuntimeType(), handle.GetRuntimeFieldInfo());
- }
- #endregion
-
#region Constructor
protected FieldInfo() { }
#endregion
#endregion
}
-
- [Serializable]
- internal abstract class RuntimeFieldInfo : FieldInfo, ISerializable
- {
- #region Private Data Members
- private BindingFlags m_bindingFlags;
- protected RuntimeTypeCache m_reflectedTypeCache;
- protected RuntimeType m_declaringType;
- #endregion
-
- #region Constructor
- protected RuntimeFieldInfo()
- {
- // Used for dummy head node during population
- }
- protected RuntimeFieldInfo(RuntimeTypeCache reflectedTypeCache, RuntimeType declaringType, BindingFlags bindingFlags)
- {
- m_bindingFlags = bindingFlags;
- m_declaringType = declaringType;
- m_reflectedTypeCache = reflectedTypeCache;
- }
- #endregion
-
- #region NonPublic Members
- internal BindingFlags BindingFlags { get { return m_bindingFlags; } }
- private RuntimeType ReflectedTypeInternal
- {
- get
- {
- return m_reflectedTypeCache.GetRuntimeType();
- }
- }
-
- internal RuntimeType GetDeclaringTypeInternal()
- {
- return m_declaringType;
- }
-
- internal RuntimeType GetRuntimeType() { return m_declaringType; }
- internal abstract RuntimeModule GetRuntimeModule();
- #endregion
-
- #region MemberInfo Overrides
- public override MemberTypes MemberType { get { return MemberTypes.Field; } }
- public override Type ReflectedType
- {
- get
- {
- return m_reflectedTypeCache.IsGlobal ? null : ReflectedTypeInternal;
- }
- }
-
- public override Type DeclaringType
- {
- get
- {
- return m_reflectedTypeCache.IsGlobal ? null : m_declaringType;
- }
- }
-
- public override Module Module { get { return GetRuntimeModule(); } }
- #endregion
-
- #region Object Overrides
- public unsafe override String ToString()
- {
- return FieldType.FormatTypeName() + " " + Name;
- }
- #endregion
-
- #region ICustomAttributeProvider
- public override Object[] GetCustomAttributes(bool inherit)
- {
- return CustomAttribute.GetCustomAttributes(this, typeof(object) as RuntimeType);
- }
-
- public override Object[] GetCustomAttributes(Type attributeType, bool inherit)
- {
- if (attributeType == null)
- throw new ArgumentNullException(nameof(attributeType));
- Contract.EndContractBlock();
-
- RuntimeType attributeRuntimeType = attributeType.UnderlyingSystemType as RuntimeType;
-
- if (attributeRuntimeType == null)
- throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"), nameof(attributeType));
-
- return CustomAttribute.GetCustomAttributes(this, attributeRuntimeType);
- }
-
- public override bool IsDefined(Type attributeType, bool inherit)
- {
- if (attributeType == null)
- throw new ArgumentNullException(nameof(attributeType));
- Contract.EndContractBlock();
-
- RuntimeType attributeRuntimeType = attributeType.UnderlyingSystemType as RuntimeType;
-
- if (attributeRuntimeType == null)
- throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"), nameof(attributeType));
-
- return CustomAttribute.IsDefined(this, attributeRuntimeType);
- }
-
- public override IList<CustomAttributeData> GetCustomAttributesData()
- {
- return CustomAttributeData.GetCustomAttributesInternal(this);
- }
- #endregion
-
- #region FieldInfo Overrides
- // All implemented on derived classes
- #endregion
-
- #region ISerializable Implementation
- public void GetObjectData(SerializationInfo info, StreamingContext context)
- {
- if (info == null)
- throw new ArgumentNullException(nameof(info));
- Contract.EndContractBlock();
- MemberInfoSerializationHolder.GetSerializationInfo(
- info,
- Name,
- ReflectedTypeInternal,
- ToString(),
- MemberTypes.Field);
- }
- #endregion
- }
-
- [Serializable]
- internal unsafe sealed class RtFieldInfo : RuntimeFieldInfo, IRuntimeFieldInfo
- {
- #region FCalls
- [MethodImplAttribute(MethodImplOptions.InternalCall)]
- static private extern void PerformVisibilityCheckOnField(IntPtr field, Object target, RuntimeType declaringType, FieldAttributes attr, uint invocationFlags);
- #endregion
-
- #region Private Data Members
- // agressive caching
- private IntPtr m_fieldHandle;
- private FieldAttributes m_fieldAttributes;
- // lazy caching
- private string m_name;
- private RuntimeType m_fieldType;
- private INVOCATION_FLAGS m_invocationFlags;
-
- internal INVOCATION_FLAGS InvocationFlags
- {
- get
- {
- if ((m_invocationFlags & INVOCATION_FLAGS.INVOCATION_FLAGS_INITIALIZED) == 0)
- {
- Type declaringType = DeclaringType;
- bool fIsReflectionOnlyType = (declaringType is ReflectionOnlyType);
-
- INVOCATION_FLAGS invocationFlags = 0;
-
- // first take care of all the NO_INVOKE cases
- if (
- (declaringType != null && declaringType.ContainsGenericParameters) ||
- (declaringType == null && Module.Assembly.ReflectionOnly) ||
- (fIsReflectionOnlyType)
- )
- {
- invocationFlags |= INVOCATION_FLAGS.INVOCATION_FLAGS_NO_INVOKE;
- }
-
- // If the invocationFlags are still 0, then
- // this should be an usable field, determine the other flags
- if (invocationFlags == 0)
- {
- if ((m_fieldAttributes & FieldAttributes.InitOnly) != (FieldAttributes)0)
- invocationFlags |= INVOCATION_FLAGS.INVOCATION_FLAGS_SPECIAL_FIELD;
-
- if ((m_fieldAttributes & FieldAttributes.HasFieldRVA) != (FieldAttributes)0)
- invocationFlags |= INVOCATION_FLAGS.INVOCATION_FLAGS_SPECIAL_FIELD;
-
- // A public field is inaccesible to Transparent code if the field is Critical.
- bool needsTransparencySecurityCheck = IsSecurityCritical && !IsSecuritySafeCritical;
- bool needsVisibilitySecurityCheck = ((m_fieldAttributes & FieldAttributes.FieldAccessMask) != FieldAttributes.Public) ||
- (declaringType != null && declaringType.NeedsReflectionSecurityCheck);
- if (needsTransparencySecurityCheck || needsVisibilitySecurityCheck)
- invocationFlags |= INVOCATION_FLAGS.INVOCATION_FLAGS_NEED_SECURITY;
-
- // find out if the field type is one of the following: Primitive, Enum or Pointer
- Type fieldType = FieldType;
- if (fieldType.IsPointer || fieldType.IsEnum || fieldType.IsPrimitive)
- invocationFlags |= INVOCATION_FLAGS.INVOCATION_FLAGS_FIELD_SPECIAL_CAST;
- }
-
- // must be last to avoid threading problems
- m_invocationFlags = invocationFlags | INVOCATION_FLAGS.INVOCATION_FLAGS_INITIALIZED;
- }
-
- return m_invocationFlags;
- }
- }
- #endregion
-
- private RuntimeAssembly GetRuntimeAssembly() { return m_declaringType.GetRuntimeAssembly(); }
-
- #region Constructor
- internal RtFieldInfo(
- RuntimeFieldHandleInternal handle, RuntimeType declaringType, RuntimeTypeCache reflectedTypeCache, BindingFlags bindingFlags)
- : base(reflectedTypeCache, declaringType, bindingFlags)
- {
- m_fieldHandle = handle.Value;
- m_fieldAttributes = RuntimeFieldHandle.GetAttributes(handle);
- }
- #endregion
-
- #region Private Members
- RuntimeFieldHandleInternal IRuntimeFieldInfo.Value
- {
- get
- {
- return new RuntimeFieldHandleInternal(m_fieldHandle);
- }
- }
-
- #endregion
-
- #region Internal Members
- internal void CheckConsistency(Object target)
- {
- // only test instance fields
- if ((m_fieldAttributes & FieldAttributes.Static) != FieldAttributes.Static)
- {
- if (!m_declaringType.IsInstanceOfType(target))
- {
- if (target == null)
- {
- throw new TargetException(Environment.GetResourceString("RFLCT.Targ_StatFldReqTarg"));
- }
- else
- {
- throw new ArgumentException(
- String.Format(CultureInfo.CurrentUICulture, Environment.GetResourceString("Arg_FieldDeclTarget"),
- Name, m_declaringType, target.GetType()));
- }
- }
- }
- }
-
- internal override bool CacheEquals(object o)
- {
- RtFieldInfo m = o as RtFieldInfo;
-
- if ((object)m == null)
- return false;
-
- return m.m_fieldHandle == m_fieldHandle;
- }
-
- [DebuggerStepThroughAttribute]
- [Diagnostics.DebuggerHidden]
- internal void InternalSetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, CultureInfo culture, ref StackCrawlMark stackMark)
- {
- INVOCATION_FLAGS invocationFlags = InvocationFlags;
- RuntimeType declaringType = DeclaringType as RuntimeType;
-
- if ((invocationFlags & INVOCATION_FLAGS.INVOCATION_FLAGS_NO_INVOKE) != 0)
- {
- if (declaringType != null && declaringType.ContainsGenericParameters)
- throw new InvalidOperationException(Environment.GetResourceString("Arg_UnboundGenField"));
-
- if ((declaringType == null && Module.Assembly.ReflectionOnly) || declaringType is ReflectionOnlyType)
- throw new InvalidOperationException(Environment.GetResourceString("Arg_ReflectionOnlyField"));
-
- throw new FieldAccessException();
- }
-
- CheckConsistency(obj);
-
- RuntimeType fieldType = (RuntimeType)FieldType;
- value = fieldType.CheckValue(value, binder, culture, invokeAttr);
-
- #region Security Check
- if ((invocationFlags & (INVOCATION_FLAGS.INVOCATION_FLAGS_SPECIAL_FIELD | INVOCATION_FLAGS.INVOCATION_FLAGS_NEED_SECURITY)) != 0)
- PerformVisibilityCheckOnField(m_fieldHandle, obj, m_declaringType, m_fieldAttributes, (uint)m_invocationFlags);
- #endregion
-
- bool domainInitialized = false;
- if (declaringType == null)
- {
- RuntimeFieldHandle.SetValue(this, obj, value, fieldType, m_fieldAttributes, null, ref domainInitialized);
- }
- else
- {
- domainInitialized = declaringType.DomainInitialized;
- RuntimeFieldHandle.SetValue(this, obj, value, fieldType, m_fieldAttributes, declaringType, ref domainInitialized);
- declaringType.DomainInitialized = domainInitialized;
- }
- }
-
- // UnsafeSetValue doesn't perform any consistency or visibility check.
- // It is the caller's responsibility to ensure the operation is safe.
- // When the caller needs to perform visibility checks they should call
- // InternalSetValue() instead. When the caller needs to perform
- // consistency checks they should call CheckConsistency() before
- // calling this method.
- [DebuggerStepThroughAttribute]
- [Diagnostics.DebuggerHidden]
- internal void UnsafeSetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, CultureInfo culture)
- {
- RuntimeType declaringType = DeclaringType as RuntimeType;
- RuntimeType fieldType = (RuntimeType)FieldType;
- value = fieldType.CheckValue(value, binder, culture, invokeAttr);
-
- bool domainInitialized = false;
- if (declaringType == null)
- {
- RuntimeFieldHandle.SetValue(this, obj, value, fieldType, m_fieldAttributes, null, ref domainInitialized);
- }
- else
- {
- domainInitialized = declaringType.DomainInitialized;
- RuntimeFieldHandle.SetValue(this, obj, value, fieldType, m_fieldAttributes, declaringType, ref domainInitialized);
- declaringType.DomainInitialized = domainInitialized;
- }
- }
-
- [DebuggerStepThroughAttribute]
- [Diagnostics.DebuggerHidden]
- internal Object InternalGetValue(Object obj, ref StackCrawlMark stackMark)
- {
- INVOCATION_FLAGS invocationFlags = InvocationFlags;
- RuntimeType declaringType = DeclaringType as RuntimeType;
-
- if ((invocationFlags & INVOCATION_FLAGS.INVOCATION_FLAGS_NO_INVOKE) != 0)
- {
- if (declaringType != null && DeclaringType.ContainsGenericParameters)
- throw new InvalidOperationException(Environment.GetResourceString("Arg_UnboundGenField"));
-
- if ((declaringType == null && Module.Assembly.ReflectionOnly) || declaringType is ReflectionOnlyType)
- throw new InvalidOperationException(Environment.GetResourceString("Arg_ReflectionOnlyField"));
-
- throw new FieldAccessException();
- }
-
- CheckConsistency(obj);
-
- RuntimeType fieldType = (RuntimeType)FieldType;
- if ((invocationFlags & INVOCATION_FLAGS.INVOCATION_FLAGS_NEED_SECURITY) != 0)
- PerformVisibilityCheckOnField(m_fieldHandle, obj, m_declaringType, m_fieldAttributes, (uint)(m_invocationFlags & ~INVOCATION_FLAGS.INVOCATION_FLAGS_SPECIAL_FIELD));
-
- return UnsafeGetValue(obj);
- }
-
- // UnsafeGetValue doesn't perform any consistency or visibility check.
- // It is the caller's responsibility to ensure the operation is safe.
- // When the caller needs to perform visibility checks they should call
- // InternalGetValue() instead. When the caller needs to perform
- // consistency checks they should call CheckConsistency() before
- // calling this method.
- [DebuggerStepThroughAttribute]
- [Diagnostics.DebuggerHidden]
- internal Object UnsafeGetValue(Object obj)
- {
- RuntimeType declaringType = DeclaringType as RuntimeType;
-
- RuntimeType fieldType = (RuntimeType)FieldType;
-
- bool domainInitialized = false;
- if (declaringType == null)
- {
- return RuntimeFieldHandle.GetValue(this, obj, fieldType, null, ref domainInitialized);
- }
- else
- {
- domainInitialized = declaringType.DomainInitialized;
- object retVal = RuntimeFieldHandle.GetValue(this, obj, fieldType, declaringType, ref domainInitialized);
- declaringType.DomainInitialized = domainInitialized;
- return retVal;
- }
- }
-
- #endregion
-
- #region MemberInfo Overrides
- public override String Name
- {
- get
- {
- if (m_name == null)
- m_name = RuntimeFieldHandle.GetName(this);
-
- return m_name;
- }
- }
-
- internal String FullName
- {
- get
- {
- return String.Format("{0}.{1}", DeclaringType.FullName, Name);
- }
- }
-
- public override int MetadataToken
- {
- get { return RuntimeFieldHandle.GetToken(this); }
- }
-
- internal override RuntimeModule GetRuntimeModule()
- {
- return RuntimeTypeHandle.GetModule(RuntimeFieldHandle.GetApproxDeclaringType(this));
- }
-
- #endregion
-
- #region FieldInfo Overrides
- public override Object GetValue(Object obj)
- {
- StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
- return InternalGetValue(obj, ref stackMark);
- }
-
- public override object GetRawConstantValue() { throw new InvalidOperationException(); }
-
- [DebuggerStepThroughAttribute]
- [Diagnostics.DebuggerHidden]
- public override Object GetValueDirect(TypedReference obj)
- {
- if (obj.IsNull)
- throw new ArgumentException(Environment.GetResourceString("Arg_TypedReference_Null"));
- Contract.EndContractBlock();
-
- unsafe
- {
- // Passing TypedReference by reference is easier to make correct in native code
- return RuntimeFieldHandle.GetValueDirect(this, (RuntimeType)FieldType, &obj, (RuntimeType)DeclaringType);
- }
- }
-
- [DebuggerStepThroughAttribute]
- [Diagnostics.DebuggerHidden]
- public override void SetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, CultureInfo culture)
- {
- StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
- InternalSetValue(obj, value, invokeAttr, binder, culture, ref stackMark);
- }
-
- [DebuggerStepThroughAttribute]
- [Diagnostics.DebuggerHidden]
- public override void SetValueDirect(TypedReference obj, Object value)
- {
- if (obj.IsNull)
- throw new ArgumentException(Environment.GetResourceString("Arg_TypedReference_Null"));
- Contract.EndContractBlock();
-
- unsafe
- {
- // Passing TypedReference by reference is easier to make correct in native code
- RuntimeFieldHandle.SetValueDirect(this, (RuntimeType)FieldType, &obj, value, (RuntimeType)DeclaringType);
- }
- }
-
- public override RuntimeFieldHandle FieldHandle
- {
- get
- {
- Type declaringType = DeclaringType;
- if ((declaringType == null && Module.Assembly.ReflectionOnly) || declaringType is ReflectionOnlyType)
- throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_NotAllowedInReflectionOnly"));
- return new RuntimeFieldHandle(this);
- }
- }
-
- internal IntPtr GetFieldHandle()
- {
- return m_fieldHandle;
- }
-
- public override FieldAttributes Attributes
- {
- get
- {
- return m_fieldAttributes;
- }
- }
-
- public override Type FieldType
- {
- get
- {
- if (m_fieldType == null)
- m_fieldType = new Signature(this, m_declaringType).FieldType;
-
- return m_fieldType;
- }
- }
-
- public override Type[] GetRequiredCustomModifiers()
- {
- return new Signature(this, m_declaringType).GetCustomModifiers(1, true);
- }
-
- public override Type[] GetOptionalCustomModifiers()
- {
- return new Signature(this, m_declaringType).GetCustomModifiers(1, false);
- }
-
- #endregion
- }
-
- [Serializable]
- internal sealed unsafe class MdFieldInfo : RuntimeFieldInfo, ISerializable
- {
- #region Private Data Members
- private int m_tkField;
- private string m_name;
- private RuntimeType m_fieldType;
- private FieldAttributes m_fieldAttributes;
- #endregion
-
- #region Constructor
- internal MdFieldInfo(
- int tkField, FieldAttributes fieldAttributes, RuntimeTypeHandle declaringTypeHandle, RuntimeTypeCache reflectedTypeCache, BindingFlags bindingFlags)
- : base(reflectedTypeCache, declaringTypeHandle.GetRuntimeType(), bindingFlags)
- {
- m_tkField = tkField;
- m_name = null;
- m_fieldAttributes = fieldAttributes;
- }
- #endregion
-
- #region Internal Members
- internal override bool CacheEquals(object o)
- {
- MdFieldInfo m = o as MdFieldInfo;
-
- if ((object)m == null)
- return false;
-
- return m.m_tkField == m_tkField &&
- m_declaringType.GetTypeHandleInternal().GetModuleHandle().Equals(
- m.m_declaringType.GetTypeHandleInternal().GetModuleHandle());
- }
- #endregion
-
- #region MemberInfo Overrides
- public override String Name
- {
- get
- {
- if (m_name == null)
- m_name = GetRuntimeModule().MetadataImport.GetName(m_tkField).ToString();
-
- return m_name;
- }
- }
-
- public override int MetadataToken { get { return m_tkField; } }
- internal override RuntimeModule GetRuntimeModule() { return m_declaringType.GetRuntimeModule(); }
- #endregion
-
- #region FieldInfo Overrides
- public override RuntimeFieldHandle FieldHandle { get { throw new NotSupportedException(); } }
- public override FieldAttributes Attributes { get { return m_fieldAttributes; } }
-
- public override bool IsSecurityCritical { get { return DeclaringType.IsSecurityCritical; } }
- public override bool IsSecuritySafeCritical { get { return DeclaringType.IsSecuritySafeCritical; } }
- public override bool IsSecurityTransparent { get { return DeclaringType.IsSecurityTransparent; } }
-
- [DebuggerStepThroughAttribute]
- [Diagnostics.DebuggerHidden]
- public override Object GetValueDirect(TypedReference obj)
- {
- return GetValue(null);
- }
-
- [DebuggerStepThroughAttribute]
- [Diagnostics.DebuggerHidden]
- public override void SetValueDirect(TypedReference obj, Object value)
- {
- throw new FieldAccessException(Environment.GetResourceString("Acc_ReadOnly"));
- }
-
- [DebuggerStepThroughAttribute]
- [Diagnostics.DebuggerHidden]
- public unsafe override Object GetValue(Object obj)
- {
- return GetValue(false);
- }
-
- public unsafe override Object GetRawConstantValue() { return GetValue(true); }
-
- private unsafe Object GetValue(bool raw)
- {
- // Cannot cache these because they could be user defined non-agile enumerations
-
- Object value = MdConstant.GetValue(GetRuntimeModule().MetadataImport, m_tkField, FieldType.GetTypeHandleInternal(), raw);
-
- if (value == DBNull.Value)
- throw new NotSupportedException(Environment.GetResourceString("Arg_EnumLitValueNotFound"));
-
- return value;
- }
-
- [DebuggerStepThroughAttribute]
- [Diagnostics.DebuggerHidden]
- public override void SetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, CultureInfo culture)
- {
- throw new FieldAccessException(Environment.GetResourceString("Acc_ReadOnly"));
- }
-
- public override Type FieldType
- {
- get
- {
- if (m_fieldType == null)
- {
- ConstArray fieldMarshal = GetRuntimeModule().MetadataImport.GetSigOfFieldDef(m_tkField);
-
- m_fieldType = new Signature(fieldMarshal.Signature.ToPointer(),
- (int)fieldMarshal.Length, m_declaringType).FieldType;
- }
-
- return m_fieldType;
- }
- }
-
- public override Type[] GetRequiredCustomModifiers()
- {
- return EmptyArray<Type>.Value;
- }
-
- public override Type[] GetOptionalCustomModifiers()
- {
- return EmptyArray<Type>.Value;
- }
-
- #endregion
- }
}
--- /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.
+
+namespace System.Reflection
+{
+ [Serializable]
+ public enum ImageFileMachine
+ {
+ I386 = 0x014c,
+ IA64 = 0x0200,
+ AMD64 = 0x8664,
+ ARM = 0x01c4,
+ }
+}
--- /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.Globalization;
+using System.Runtime.Serialization;
+using RuntimeTypeCache = System.RuntimeType.RuntimeTypeCache;
+
+namespace System.Reflection
+{
+ [Serializable]
+ internal sealed unsafe class MdFieldInfo : RuntimeFieldInfo, ISerializable
+ {
+ #region Private Data Members
+ private int m_tkField;
+ private string m_name;
+ private RuntimeType m_fieldType;
+ private FieldAttributes m_fieldAttributes;
+ #endregion
+
+ #region Constructor
+ internal MdFieldInfo(
+ int tkField, FieldAttributes fieldAttributes, RuntimeTypeHandle declaringTypeHandle, RuntimeTypeCache reflectedTypeCache, BindingFlags bindingFlags)
+ : base(reflectedTypeCache, declaringTypeHandle.GetRuntimeType(), bindingFlags)
+ {
+ m_tkField = tkField;
+ m_name = null;
+ m_fieldAttributes = fieldAttributes;
+ }
+ #endregion
+
+ #region Internal Members
+ internal override bool CacheEquals(object o)
+ {
+ MdFieldInfo m = o as MdFieldInfo;
+
+ if ((object)m == null)
+ return false;
+
+ return m.m_tkField == m_tkField &&
+ m_declaringType.GetTypeHandleInternal().GetModuleHandle().Equals(
+ m.m_declaringType.GetTypeHandleInternal().GetModuleHandle());
+ }
+ #endregion
+
+ #region MemberInfo Overrides
+ public override String Name
+ {
+ get
+ {
+ if (m_name == null)
+ m_name = GetRuntimeModule().MetadataImport.GetName(m_tkField).ToString();
+
+ return m_name;
+ }
+ }
+
+ public override int MetadataToken { get { return m_tkField; } }
+ internal override RuntimeModule GetRuntimeModule() { return m_declaringType.GetRuntimeModule(); }
+ #endregion
+
+ #region FieldInfo Overrides
+ public override RuntimeFieldHandle FieldHandle { get { throw new NotSupportedException(); } }
+ public override FieldAttributes Attributes { get { return m_fieldAttributes; } }
+
+ public override bool IsSecurityCritical { get { return DeclaringType.IsSecurityCritical; } }
+ public override bool IsSecuritySafeCritical { get { return DeclaringType.IsSecuritySafeCritical; } }
+ public override bool IsSecurityTransparent { get { return DeclaringType.IsSecurityTransparent; } }
+
+ [DebuggerStepThroughAttribute]
+ [Diagnostics.DebuggerHidden]
+ public override Object GetValueDirect(TypedReference obj)
+ {
+ return GetValue(null);
+ }
+
+ [DebuggerStepThroughAttribute]
+ [Diagnostics.DebuggerHidden]
+ public override void SetValueDirect(TypedReference obj, Object value)
+ {
+ throw new FieldAccessException(Environment.GetResourceString("Acc_ReadOnly"));
+ }
+
+ [DebuggerStepThroughAttribute]
+ [Diagnostics.DebuggerHidden]
+ public unsafe override Object GetValue(Object obj)
+ {
+ return GetValue(false);
+ }
+
+ public unsafe override Object GetRawConstantValue() { return GetValue(true); }
+
+ private unsafe Object GetValue(bool raw)
+ {
+ // Cannot cache these because they could be user defined non-agile enumerations
+
+ Object value = MdConstant.GetValue(GetRuntimeModule().MetadataImport, m_tkField, FieldType.GetTypeHandleInternal(), raw);
+
+ if (value == DBNull.Value)
+ throw new NotSupportedException(Environment.GetResourceString("Arg_EnumLitValueNotFound"));
+
+ return value;
+ }
+
+ [DebuggerStepThroughAttribute]
+ [Diagnostics.DebuggerHidden]
+ public override void SetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, CultureInfo culture)
+ {
+ throw new FieldAccessException(Environment.GetResourceString("Acc_ReadOnly"));
+ }
+
+ public override Type FieldType
+ {
+ get
+ {
+ if (m_fieldType == null)
+ {
+ ConstArray fieldMarshal = GetRuntimeModule().MetadataImport.GetSigOfFieldDef(m_tkField);
+
+ m_fieldType = new Signature(fieldMarshal.Signature.ToPointer(),
+ (int)fieldMarshal.Length, m_declaringType).FieldType;
+ }
+
+ return m_fieldType;
+ }
+ }
+
+ public override Type[] GetRequiredCustomModifiers()
+ {
+ return EmptyArray<Type>.Value;
+ }
+
+ public override Type[] GetOptionalCustomModifiers()
+ {
+ return EmptyArray<Type>.Value;
+ }
+
+ #endregion
+ }
+}
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
-//
-
namespace System.Reflection
{
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.Diagnostics.Contracts;
- using System.Globalization;
- using System.Runtime;
- using System.Runtime.InteropServices;
- using System.Runtime.ConstrainedExecution;
- using System.Runtime.Serialization;
- using System.Security;
- using System.Text;
- using System.Threading;
- using MemberListType = System.RuntimeType.MemberListType;
- using RuntimeTypeCache = System.RuntimeType.RuntimeTypeCache;
- using System.Runtime.CompilerServices;
-
[Serializable]
public abstract class MethodInfo : MethodBase
{
public virtual Delegate CreateDelegate(Type delegateType, Object target) { throw new NotSupportedException(Environment.GetResourceString("NotSupported_SubclassOverride")); }
#endregion
}
-
- [Serializable]
- internal sealed class RuntimeMethodInfo : MethodInfo, ISerializable, IRuntimeMethodInfo
- {
- #region Private Data Members
- private IntPtr m_handle;
- private RuntimeTypeCache m_reflectedTypeCache;
- private string m_name;
- private string m_toString;
- private ParameterInfo[] m_parameters;
- private ParameterInfo m_returnParameter;
- private BindingFlags m_bindingFlags;
- private MethodAttributes m_methodAttributes;
- private Signature m_signature;
- private RuntimeType m_declaringType;
- private object m_keepalive;
- private INVOCATION_FLAGS m_invocationFlags;
-
- internal INVOCATION_FLAGS InvocationFlags
- {
- get
- {
- if ((m_invocationFlags & INVOCATION_FLAGS.INVOCATION_FLAGS_INITIALIZED) == 0)
- {
- INVOCATION_FLAGS invocationFlags = INVOCATION_FLAGS.INVOCATION_FLAGS_UNKNOWN;
-
- Type declaringType = DeclaringType;
-
- //
- // first take care of all the NO_INVOKE cases.
- if (ContainsGenericParameters ||
- ReturnType.IsByRef ||
- (declaringType != null && declaringType.ContainsGenericParameters) ||
- ((CallingConvention & CallingConventions.VarArgs) == CallingConventions.VarArgs) ||
- ((Attributes & MethodAttributes.RequireSecObject) == MethodAttributes.RequireSecObject))
- {
- // We don't need other flags if this method cannot be invoked
- invocationFlags = INVOCATION_FLAGS.INVOCATION_FLAGS_NO_INVOKE;
- }
- else
- {
- // this should be an invocable method, determine the other flags that participate in invocation
- invocationFlags = RuntimeMethodHandle.GetSecurityFlags(this);
-
- if ((invocationFlags & INVOCATION_FLAGS.INVOCATION_FLAGS_NEED_SECURITY) == 0)
- {
- if ((Attributes & MethodAttributes.MemberAccessMask) != MethodAttributes.Public ||
- (declaringType != null && declaringType.NeedsReflectionSecurityCheck))
- {
- // If method is non-public, or declaring type is not visible
- invocationFlags |= INVOCATION_FLAGS.INVOCATION_FLAGS_NEED_SECURITY;
- }
- else if (IsGenericMethod)
- {
- Type[] genericArguments = GetGenericArguments();
-
- for (int i = 0; i < genericArguments.Length; i++)
- {
- if (genericArguments[i].NeedsReflectionSecurityCheck)
- {
- invocationFlags |= INVOCATION_FLAGS.INVOCATION_FLAGS_NEED_SECURITY;
- break;
- }
- }
- }
- }
- }
-
- m_invocationFlags = invocationFlags | INVOCATION_FLAGS.INVOCATION_FLAGS_INITIALIZED;
- }
-
- return m_invocationFlags;
- }
- }
- #endregion
-
- #region Constructor
- internal RuntimeMethodInfo(
- RuntimeMethodHandleInternal handle, RuntimeType declaringType,
- RuntimeTypeCache reflectedTypeCache, MethodAttributes methodAttributes, BindingFlags bindingFlags, object keepalive)
- {
- Contract.Ensures(!m_handle.IsNull());
-
- Debug.Assert(!handle.IsNullHandle());
- Debug.Assert(methodAttributes == RuntimeMethodHandle.GetAttributes(handle));
-
- m_bindingFlags = bindingFlags;
- m_declaringType = declaringType;
- m_keepalive = keepalive;
- m_handle = handle.Value;
- m_reflectedTypeCache = reflectedTypeCache;
- m_methodAttributes = methodAttributes;
- }
- #endregion
-
- #region Private Methods
- RuntimeMethodHandleInternal IRuntimeMethodInfo.Value
- {
- get
- {
- return new RuntimeMethodHandleInternal(m_handle);
- }
- }
-
- private RuntimeType ReflectedTypeInternal
- {
- get
- {
- return m_reflectedTypeCache.GetRuntimeType();
- }
- }
-
- private ParameterInfo[] FetchNonReturnParameters()
- {
- if (m_parameters == null)
- m_parameters = RuntimeParameterInfo.GetParameters(this, this, Signature);
-
- return m_parameters;
- }
-
- private ParameterInfo FetchReturnParameter()
- {
- if (m_returnParameter == null)
- m_returnParameter = RuntimeParameterInfo.GetReturnParameter(this, this, Signature);
-
- return m_returnParameter;
- }
- #endregion
-
- #region Internal Members
- internal override string FormatNameAndSig(bool serialization)
- {
- // Serialization uses ToString to resolve MethodInfo overloads.
- StringBuilder sbName = new StringBuilder(Name);
-
- // serialization == true: use unambiguous (except for assembly name) type names to distinguish between overloads.
- // serialization == false: use basic format to maintain backward compatibility of MethodInfo.ToString().
- TypeNameFormatFlags format = serialization ? TypeNameFormatFlags.FormatSerialization : TypeNameFormatFlags.FormatBasic;
-
- if (IsGenericMethod)
- sbName.Append(RuntimeMethodHandle.ConstructInstantiation(this, format));
-
- sbName.Append("(");
- sbName.Append(ConstructParameters(GetParameterTypes(), CallingConvention, serialization));
- sbName.Append(")");
-
- return sbName.ToString();
- }
-
- internal override bool CacheEquals(object o)
- {
- RuntimeMethodInfo m = o as RuntimeMethodInfo;
-
- if ((object)m == null)
- return false;
-
- return m.m_handle == m_handle;
- }
-
- internal Signature Signature
- {
- get
- {
- if (m_signature == null)
- m_signature = new Signature(this, m_declaringType);
-
- return m_signature;
- }
- }
-
- internal BindingFlags BindingFlags { get { return m_bindingFlags; } }
-
- internal RuntimeMethodInfo GetParentDefinition()
- {
- if (!IsVirtual || m_declaringType.IsInterface)
- return null;
-
- RuntimeType parent = (RuntimeType)m_declaringType.BaseType;
-
- if (parent == null)
- return null;
-
- int slot = RuntimeMethodHandle.GetSlot(this);
-
- if (RuntimeTypeHandle.GetNumVirtuals(parent) <= slot)
- return null;
-
- return (RuntimeMethodInfo)RuntimeType.GetMethodBase(parent, RuntimeTypeHandle.GetMethodAt(parent, slot));
- }
-
- // Unlike DeclaringType, this will return a valid type even for global methods
- internal RuntimeType GetDeclaringTypeInternal()
- {
- return m_declaringType;
- }
-
- #endregion
-
- #region Object Overrides
- public override String ToString()
- {
- if (m_toString == null)
- m_toString = ReturnType.FormatTypeName() + " " + FormatNameAndSig();
-
- return m_toString;
- }
-
- public override int GetHashCode()
- {
- // See RuntimeMethodInfo.Equals() below.
- if (IsGenericMethod)
- return ValueType.GetHashCodeOfPtr(m_handle);
- else
- return base.GetHashCode();
- }
-
- public override bool Equals(object obj)
- {
- if (!IsGenericMethod)
- return obj == (object)this;
-
- // We cannot do simple object identity comparisons for generic methods.
- // Equals will be called in CerHashTable when RuntimeType+RuntimeTypeCache.GetGenericMethodInfo()
- // retrieve items from and insert items into s_methodInstantiations which is a CerHashtable.
-
- RuntimeMethodInfo mi = obj as RuntimeMethodInfo;
-
- if (mi == null || !mi.IsGenericMethod)
- return false;
-
- // now we know that both operands are generic methods
-
- IRuntimeMethodInfo handle1 = RuntimeMethodHandle.StripMethodInstantiation(this);
- IRuntimeMethodInfo handle2 = RuntimeMethodHandle.StripMethodInstantiation(mi);
- if (handle1.Value.Value != handle2.Value.Value)
- return false;
-
- Type[] lhs = GetGenericArguments();
- Type[] rhs = mi.GetGenericArguments();
-
- if (lhs.Length != rhs.Length)
- return false;
-
- for (int i = 0; i < lhs.Length; i++)
- {
- if (lhs[i] != rhs[i])
- return false;
- }
-
- if (DeclaringType != mi.DeclaringType)
- return false;
-
- if (ReflectedType != mi.ReflectedType)
- return false;
-
- return true;
- }
- #endregion
-
- #region ICustomAttributeProvider
- public override Object[] GetCustomAttributes(bool inherit)
- {
- return CustomAttribute.GetCustomAttributes(this, typeof(object) as RuntimeType as RuntimeType, inherit);
- }
-
- public override Object[] GetCustomAttributes(Type attributeType, bool inherit)
- {
- if (attributeType == null)
- throw new ArgumentNullException(nameof(attributeType));
- Contract.EndContractBlock();
-
- RuntimeType attributeRuntimeType = attributeType.UnderlyingSystemType as RuntimeType;
-
- if (attributeRuntimeType == null)
- throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"), nameof(attributeType));
-
- return CustomAttribute.GetCustomAttributes(this, attributeRuntimeType, inherit);
- }
-
- public override bool IsDefined(Type attributeType, bool inherit)
- {
- if (attributeType == null)
- throw new ArgumentNullException(nameof(attributeType));
- Contract.EndContractBlock();
-
- RuntimeType attributeRuntimeType = attributeType.UnderlyingSystemType as RuntimeType;
-
- if (attributeRuntimeType == null)
- throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"), nameof(attributeType));
-
- return CustomAttribute.IsDefined(this, attributeRuntimeType, inherit);
- }
-
- public override IList<CustomAttributeData> GetCustomAttributesData()
- {
- return CustomAttributeData.GetCustomAttributesInternal(this);
- }
- #endregion
-
- #region MemberInfo Overrides
- public override String Name
- {
- get
- {
- if (m_name == null)
- m_name = RuntimeMethodHandle.GetName(this);
-
- return m_name;
- }
- }
-
- public override Type DeclaringType
- {
- get
- {
- if (m_reflectedTypeCache.IsGlobal)
- return null;
-
- return m_declaringType;
- }
- }
-
- public override Type ReflectedType
- {
- get
- {
- if (m_reflectedTypeCache.IsGlobal)
- return null;
-
- return m_reflectedTypeCache.GetRuntimeType();
- }
- }
-
- public override MemberTypes MemberType { get { return MemberTypes.Method; } }
- public override int MetadataToken
- {
- get { return RuntimeMethodHandle.GetMethodDef(this); }
- }
- public override Module Module { get { return GetRuntimeModule(); } }
- internal RuntimeType GetRuntimeType() { return m_declaringType; }
- internal RuntimeModule GetRuntimeModule() { return m_declaringType.GetRuntimeModule(); }
- internal RuntimeAssembly GetRuntimeAssembly() { return GetRuntimeModule().GetRuntimeAssembly(); }
-
- public override bool IsSecurityCritical
- {
- get { return true; }
- }
- public override bool IsSecuritySafeCritical
- {
- get { return false; }
- }
- public override bool IsSecurityTransparent
- {
- get { return false; }
- }
- #endregion
-
- #region MethodBase Overrides
- internal override ParameterInfo[] GetParametersNoCopy()
- {
- FetchNonReturnParameters();
-
- return m_parameters;
- }
-
- [System.Diagnostics.Contracts.Pure]
- public override ParameterInfo[] GetParameters()
- {
- FetchNonReturnParameters();
-
- if (m_parameters.Length == 0)
- return m_parameters;
-
- ParameterInfo[] ret = new ParameterInfo[m_parameters.Length];
-
- Array.Copy(m_parameters, ret, m_parameters.Length);
-
- return ret;
- }
-
- public override MethodImplAttributes GetMethodImplementationFlags()
- {
- return RuntimeMethodHandle.GetImplAttributes(this);
- }
-
- public override RuntimeMethodHandle MethodHandle
- {
- get
- {
- Type declaringType = DeclaringType;
- if ((declaringType == null && Module.Assembly.ReflectionOnly) || declaringType is ReflectionOnlyType)
- throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_NotAllowedInReflectionOnly"));
- return new RuntimeMethodHandle(this);
- }
- }
-
- public override MethodAttributes Attributes { get { return m_methodAttributes; } }
-
- public override CallingConventions CallingConvention
- {
- get
- {
- return Signature.CallingConvention;
- }
- }
-
- public override MethodBody GetMethodBody()
- {
- MethodBody mb = RuntimeMethodHandle.GetMethodBody(this, ReflectedTypeInternal);
- if (mb != null)
- mb.m_methodBase = this;
- return mb;
- }
- #endregion
-
- #region Invocation Logic(On MemberBase)
- private void CheckConsistency(Object target)
- {
- // only test instance methods
- if ((m_methodAttributes & MethodAttributes.Static) != MethodAttributes.Static)
- {
- if (!m_declaringType.IsInstanceOfType(target))
- {
- if (target == null)
- throw new TargetException(Environment.GetResourceString("RFLCT.Targ_StatMethReqTarg"));
- else
- throw new TargetException(Environment.GetResourceString("RFLCT.Targ_ITargMismatch"));
- }
- }
- }
-
- private void ThrowNoInvokeException()
- {
- // method is ReflectionOnly
- Type declaringType = DeclaringType;
- if ((declaringType == null && Module.Assembly.ReflectionOnly) || declaringType is ReflectionOnlyType)
- {
- throw new InvalidOperationException(Environment.GetResourceString("Arg_ReflectionOnlyInvoke"));
- }
- // method is on a class that contains stack pointers
- else if ((InvocationFlags & INVOCATION_FLAGS.INVOCATION_FLAGS_CONTAINS_STACK_POINTERS) != 0)
- {
- throw new NotSupportedException();
- }
- // method is vararg
- else if ((CallingConvention & CallingConventions.VarArgs) == CallingConventions.VarArgs)
- {
- throw new NotSupportedException();
- }
- // method is generic or on a generic class
- else if (DeclaringType.ContainsGenericParameters || ContainsGenericParameters)
- {
- throw new InvalidOperationException(Environment.GetResourceString("Arg_UnboundGenParam"));
- }
- // method is abstract class
- else if (IsAbstract)
- {
- throw new MemberAccessException();
- }
- // ByRef return are not allowed in reflection
- else if (ReturnType.IsByRef)
- {
- throw new NotSupportedException(Environment.GetResourceString("NotSupported_ByRefReturn"));
- }
-
- throw new TargetException();
- }
-
- [DebuggerStepThroughAttribute]
- [Diagnostics.DebuggerHidden]
- [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod
- public override Object Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
- {
- object[] arguments = InvokeArgumentsCheck(obj, invokeAttr, binder, parameters, culture);
-
- return UnsafeInvokeInternal(obj, parameters, arguments);
- }
-
- [DebuggerStepThroughAttribute]
- [Diagnostics.DebuggerHidden]
- internal object UnsafeInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
- {
- object[] arguments = InvokeArgumentsCheck(obj, invokeAttr, binder, parameters, culture);
-
- return UnsafeInvokeInternal(obj, parameters, arguments);
- }
-
- [DebuggerStepThroughAttribute]
- [Diagnostics.DebuggerHidden]
- private object UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
- {
- if (arguments == null || arguments.Length == 0)
- return RuntimeMethodHandle.InvokeMethod(obj, null, Signature, false);
- else
- {
- Object retValue = RuntimeMethodHandle.InvokeMethod(obj, arguments, Signature, false);
-
- // copy out. This should be made only if ByRef are present.
- for (int index = 0; index < arguments.Length; index++)
- parameters[index] = arguments[index];
-
- return retValue;
- }
- }
-
- [DebuggerStepThroughAttribute]
- [Diagnostics.DebuggerHidden]
- private object[] InvokeArgumentsCheck(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
- {
- Signature sig = Signature;
-
- // get the signature
- int formalCount = sig.Arguments.Length;
- int actualCount = (parameters != null) ? parameters.Length : 0;
-
- INVOCATION_FLAGS invocationFlags = InvocationFlags;
-
- // INVOCATION_FLAGS_CONTAINS_STACK_POINTERS means that the struct (either the declaring type or the return type)
- // contains pointers that point to the stack. This is either a ByRef or a TypedReference. These structs cannot
- // be boxed and thus cannot be invoked through reflection which only deals with boxed value type objects.
- if ((invocationFlags & (INVOCATION_FLAGS.INVOCATION_FLAGS_NO_INVOKE | INVOCATION_FLAGS.INVOCATION_FLAGS_CONTAINS_STACK_POINTERS)) != 0)
- ThrowNoInvokeException();
-
- // check basic method consistency. This call will throw if there are problems in the target/method relationship
- CheckConsistency(obj);
-
- if (formalCount != actualCount)
- throw new TargetParameterCountException(Environment.GetResourceString("Arg_ParmCnt"));
-
- if (actualCount != 0)
- return CheckArguments(parameters, binder, invokeAttr, culture, sig);
- else
- return null;
- }
-
- #endregion
-
- #region MethodInfo Overrides
- public override Type ReturnType
- {
- get { return Signature.ReturnType; }
- }
-
- public override ICustomAttributeProvider ReturnTypeCustomAttributes
- {
- get { return ReturnParameter; }
- }
-
- public override ParameterInfo ReturnParameter
- {
- get
- {
- Contract.Ensures(m_returnParameter != null);
-
- FetchReturnParameter();
- return m_returnParameter as ParameterInfo;
- }
- }
-
- public override MethodInfo GetBaseDefinition()
- {
- if (!IsVirtual || IsStatic || m_declaringType == null || m_declaringType.IsInterface)
- return this;
-
- int slot = RuntimeMethodHandle.GetSlot(this);
- RuntimeType declaringType = (RuntimeType)DeclaringType;
- RuntimeType baseDeclaringType = declaringType;
- RuntimeMethodHandleInternal baseMethodHandle = new RuntimeMethodHandleInternal();
-
- do
- {
- int cVtblSlots = RuntimeTypeHandle.GetNumVirtuals(declaringType);
-
- if (cVtblSlots <= slot)
- break;
-
- baseMethodHandle = RuntimeTypeHandle.GetMethodAt(declaringType, slot);
- baseDeclaringType = declaringType;
-
- declaringType = (RuntimeType)declaringType.BaseType;
- } while (declaringType != null);
-
- return (MethodInfo)RuntimeType.GetMethodBase(baseDeclaringType, baseMethodHandle);
- }
-
- public override Delegate CreateDelegate(Type delegateType)
- {
- StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
-
- // This API existed in v1/v1.1 and only expected to create closed
- // instance delegates. Constrain the call to BindToMethodInfo to
- // open delegates only for backwards compatibility. But we'll allow
- // relaxed signature checking and open static delegates because
- // there's no ambiguity there (the caller would have to explicitly
- // pass us a static method or a method with a non-exact signature
- // and the only change in behavior from v1.1 there is that we won't
- // fail the call).
- return CreateDelegateInternal(
- delegateType,
- null,
- DelegateBindingFlags.OpenDelegateOnly | DelegateBindingFlags.RelaxedSignature,
- ref stackMark);
- }
-
- public override Delegate CreateDelegate(Type delegateType, Object target)
- {
- StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
-
- // This API is new in Whidbey and allows the full range of delegate
- // flexability (open or closed delegates binding to static or
- // instance methods with relaxed signature checking). The delegate
- // can also be closed over null. There's no ambiguity with all these
- // options since the caller is providing us a specific MethodInfo.
- return CreateDelegateInternal(
- delegateType,
- target,
- DelegateBindingFlags.RelaxedSignature,
- ref stackMark);
- }
-
- private Delegate CreateDelegateInternal(Type delegateType, Object firstArgument, DelegateBindingFlags bindingFlags, ref StackCrawlMark stackMark)
- {
- // Validate the parameters.
- if (delegateType == null)
- throw new ArgumentNullException(nameof(delegateType));
- Contract.EndContractBlock();
-
- RuntimeType rtType = delegateType as RuntimeType;
- if (rtType == null)
- throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeType"), nameof(delegateType));
-
- if (!rtType.IsDelegate())
- throw new ArgumentException(Environment.GetResourceString("Arg_MustBeDelegate"), nameof(delegateType));
-
- Delegate d = Delegate.CreateDelegateInternal(rtType, this, firstArgument, bindingFlags, ref stackMark);
- if (d == null)
- {
- throw new ArgumentException(Environment.GetResourceString("Arg_DlgtTargMeth"));
- }
-
- return d;
- }
-
- #endregion
-
- #region Generics
- public override MethodInfo MakeGenericMethod(params Type[] methodInstantiation)
- {
- if (methodInstantiation == null)
- throw new ArgumentNullException(nameof(methodInstantiation));
- Contract.EndContractBlock();
-
- RuntimeType[] methodInstantionRuntimeType = new RuntimeType[methodInstantiation.Length];
-
- if (!IsGenericMethodDefinition)
- throw new InvalidOperationException(
- Environment.GetResourceString("Arg_NotGenericMethodDefinition", this));
-
- for (int i = 0; i < methodInstantiation.Length; i++)
- {
- Type methodInstantiationElem = methodInstantiation[i];
-
- if (methodInstantiationElem == null)
- throw new ArgumentNullException();
-
- RuntimeType rtMethodInstantiationElem = methodInstantiationElem as RuntimeType;
-
- if (rtMethodInstantiationElem == null)
- {
- Type[] methodInstantiationCopy = new Type[methodInstantiation.Length];
- for (int iCopy = 0; iCopy < methodInstantiation.Length; iCopy++)
- methodInstantiationCopy[iCopy] = methodInstantiation[iCopy];
- methodInstantiation = methodInstantiationCopy;
- return System.Reflection.Emit.MethodBuilderInstantiation.MakeGenericMethod(this, methodInstantiation);
- }
-
- methodInstantionRuntimeType[i] = rtMethodInstantiationElem;
- }
-
- RuntimeType[] genericParameters = GetGenericArgumentsInternal();
-
- RuntimeType.SanityCheckGenericArguments(methodInstantionRuntimeType, genericParameters);
-
- MethodInfo ret = null;
-
- try
- {
- ret = RuntimeType.GetMethodBase(ReflectedTypeInternal,
- RuntimeMethodHandle.GetStubIfNeeded(new RuntimeMethodHandleInternal(m_handle), m_declaringType, methodInstantionRuntimeType)) as MethodInfo;
- }
- catch (VerificationException e)
- {
- RuntimeType.ValidateGenericArguments(this, methodInstantionRuntimeType, e);
- throw;
- }
-
- return ret;
- }
-
- internal RuntimeType[] GetGenericArgumentsInternal()
- {
- return RuntimeMethodHandle.GetMethodInstantiationInternal(this);
- }
-
- public override Type[] GetGenericArguments()
- {
- Type[] types = RuntimeMethodHandle.GetMethodInstantiationPublic(this);
-
- if (types == null)
- {
- types = EmptyArray<Type>.Value;
- }
- return types;
- }
-
- public override MethodInfo GetGenericMethodDefinition()
- {
- if (!IsGenericMethod)
- throw new InvalidOperationException();
- Contract.EndContractBlock();
-
- return RuntimeType.GetMethodBase(m_declaringType, RuntimeMethodHandle.StripMethodInstantiation(this)) as MethodInfo;
- }
-
- public override bool IsGenericMethod
- {
- get { return RuntimeMethodHandle.HasMethodInstantiation(this); }
- }
-
- public override bool IsGenericMethodDefinition
- {
- get { return RuntimeMethodHandle.IsGenericMethodDefinition(this); }
- }
-
- public override bool ContainsGenericParameters
- {
- get
- {
- if (DeclaringType != null && DeclaringType.ContainsGenericParameters)
- return true;
-
- if (!IsGenericMethod)
- return false;
-
- Type[] pis = GetGenericArguments();
- for (int i = 0; i < pis.Length; i++)
- {
- if (pis[i].ContainsGenericParameters)
- return true;
- }
-
- return false;
- }
- }
- #endregion
-
- #region ISerializable Implementation
- public void GetObjectData(SerializationInfo info, StreamingContext context)
- {
- if (info == null)
- throw new ArgumentNullException(nameof(info));
- Contract.EndContractBlock();
-
- if (m_reflectedTypeCache.IsGlobal)
- throw new NotSupportedException(Environment.GetResourceString("NotSupported_GlobalMethodSerialization"));
-
- MemberInfoSerializationHolder.GetSerializationInfo(
- info,
- Name,
- ReflectedTypeInternal,
- ToString(),
- SerializationToString(),
- MemberTypes.Method,
- IsGenericMethod & !IsGenericMethodDefinition ? GetGenericArguments() : null);
- }
-
- internal string SerializationToString()
- {
- return ReturnType.FormatTypeName(true) + " " + FormatNameAndSig(true);
- }
- #endregion
-
- #region Legacy Internal
- internal static MethodBase InternalGetCurrentMethod(ref StackCrawlMark stackMark)
- {
- IRuntimeMethodInfo method = RuntimeMethodHandle.GetCurrentMethod(ref stackMark);
-
- if (method == null)
- return null;
-
- return RuntimeType.GetMethodBase(method);
- }
- #endregion
- }
}
// 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.Runtime.Serialization;
+using System.Collections.Generic;
+using System.Diagnostics.Contracts;
namespace System.Reflection
{
- using System;
- using System.Diagnostics.SymbolStore;
- using System.Runtime.Remoting;
- using System.Runtime.InteropServices;
- using System.Runtime.Serialization;
- using System.Collections;
- using System.Collections.Generic;
- using System.Threading;
- using System.Runtime.CompilerServices;
- using System.Security;
- using System.IO;
- using System.Globalization;
- using System.Runtime.Versioning;
- using System.Diagnostics.Contracts;
-
- [Serializable]
- [Flags]
- public enum PortableExecutableKinds
- {
- NotAPortableExecutableImage = 0x0,
-
- ILOnly = 0x1,
-
- Required32Bit = 0x2,
-
- PE32Plus = 0x4,
-
- Unmanaged32Bit = 0x8,
-
- Preferred32Bit = 0x10,
- }
-
- [Serializable]
- public enum ImageFileMachine
- {
- I386 = 0x014c,
-
- IA64 = 0x0200,
-
- AMD64 = 0x8664,
-
- ARM = 0x01c4,
- }
-
[Serializable]
public abstract class Module : ISerializable, ICustomAttributeProvider
{
}
#endregion
}
-
- [Serializable]
- internal class RuntimeModule : Module
- {
- internal RuntimeModule() { throw new NotSupportedException(); }
-
- #region FCalls
- [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
- [SuppressUnmanagedCodeSecurity]
- private extern static void GetType(RuntimeModule module, String className, bool ignoreCase, bool throwOnError, ObjectHandleOnStack type, ObjectHandleOnStack keepAlive);
-
- [DllImport(JitHelpers.QCall)]
- [SuppressUnmanagedCodeSecurity]
- private static extern bool nIsTransientInternal(RuntimeModule module);
-
- [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
- [SuppressUnmanagedCodeSecurity]
- private extern static void GetScopeName(RuntimeModule module, StringHandleOnStack retString);
-
- [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
- [SuppressUnmanagedCodeSecurity]
- private extern static void GetFullyQualifiedName(RuntimeModule module, StringHandleOnStack retString);
-
- [MethodImplAttribute(MethodImplOptions.InternalCall)]
- private extern static RuntimeType[] GetTypes(RuntimeModule module);
-
- internal RuntimeType[] GetDefinedTypes()
- {
- return GetTypes(GetNativeHandle());
- }
-
- [MethodImplAttribute(MethodImplOptions.InternalCall)]
- private extern static bool IsResource(RuntimeModule module);
- #endregion
-
- #region Module overrides
- private static RuntimeTypeHandle[] ConvertToTypeHandleArray(Type[] genericArguments)
- {
- if (genericArguments == null)
- return null;
-
- int size = genericArguments.Length;
- RuntimeTypeHandle[] typeHandleArgs = new RuntimeTypeHandle[size];
- for (int i = 0; i < size; i++)
- {
- Type typeArg = genericArguments[i];
- if (typeArg == null)
- throw new ArgumentException(Environment.GetResourceString("Argument_InvalidGenericInstArray"));
- typeArg = typeArg.UnderlyingSystemType;
- if (typeArg == null)
- throw new ArgumentException(Environment.GetResourceString("Argument_InvalidGenericInstArray"));
- if (!(typeArg is RuntimeType))
- throw new ArgumentException(Environment.GetResourceString("Argument_InvalidGenericInstArray"));
- typeHandleArgs[i] = typeArg.GetTypeHandleInternal();
- }
- return typeHandleArgs;
- }
-
- public override byte[] ResolveSignature(int metadataToken)
- {
- MetadataToken tk = new MetadataToken(metadataToken);
-
- if (!MetadataImport.IsValidToken(tk))
- throw new ArgumentOutOfRangeException(nameof(metadataToken),
- Environment.GetResourceString("Argument_InvalidToken", tk, this));
-
- if (!tk.IsMemberRef && !tk.IsMethodDef && !tk.IsTypeSpec && !tk.IsSignature && !tk.IsFieldDef)
- throw new ArgumentException(Environment.GetResourceString("Argument_InvalidToken", tk, this),
- nameof(metadataToken));
-
- ConstArray signature;
- if (tk.IsMemberRef)
- signature = MetadataImport.GetMemberRefProps(metadataToken);
- else
- signature = MetadataImport.GetSignatureFromToken(metadataToken);
-
- byte[] sig = new byte[signature.Length];
-
- for (int i = 0; i < signature.Length; i++)
- sig[i] = signature[i];
-
- return sig;
- }
-
- public override MethodBase ResolveMethod(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments)
- {
- MetadataToken tk = new MetadataToken(metadataToken);
-
- if (!MetadataImport.IsValidToken(tk))
- throw new ArgumentOutOfRangeException(nameof(metadataToken),
- Environment.GetResourceString("Argument_InvalidToken", tk, this));
-
- RuntimeTypeHandle[] typeArgs = ConvertToTypeHandleArray(genericTypeArguments);
- RuntimeTypeHandle[] methodArgs = ConvertToTypeHandleArray(genericMethodArguments);
-
- try
- {
- if (!tk.IsMethodDef && !tk.IsMethodSpec)
- {
- if (!tk.IsMemberRef)
- throw new ArgumentException(Environment.GetResourceString("Argument_ResolveMethod", tk, this),
- nameof(metadataToken));
-
- unsafe
- {
- ConstArray sig = MetadataImport.GetMemberRefProps(tk);
-
- if (*(MdSigCallingConvention*)sig.Signature.ToPointer() == MdSigCallingConvention.Field)
- throw new ArgumentException(Environment.GetResourceString("Argument_ResolveMethod", tk, this),
- nameof(metadataToken));
- }
- }
-
- IRuntimeMethodInfo methodHandle = ModuleHandle.ResolveMethodHandleInternal(GetNativeHandle(), tk, typeArgs, methodArgs);
- Type declaringType = RuntimeMethodHandle.GetDeclaringType(methodHandle);
-
- if (declaringType.IsGenericType || declaringType.IsArray)
- {
- MetadataToken tkDeclaringType = new MetadataToken(MetadataImport.GetParentToken(tk));
-
- if (tk.IsMethodSpec)
- tkDeclaringType = new MetadataToken(MetadataImport.GetParentToken(tkDeclaringType));
-
- declaringType = ResolveType(tkDeclaringType, genericTypeArguments, genericMethodArguments);
- }
-
- return System.RuntimeType.GetMethodBase(declaringType as RuntimeType, methodHandle);
- }
- catch (BadImageFormatException e)
- {
- throw new ArgumentException(Environment.GetResourceString("Argument_BadImageFormatExceptionResolve"), e);
- }
- }
-
- private FieldInfo ResolveLiteralField(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments)
- {
- MetadataToken tk = new MetadataToken(metadataToken);
-
- if (!MetadataImport.IsValidToken(tk) || !tk.IsFieldDef)
- throw new ArgumentOutOfRangeException(nameof(metadataToken),
- String.Format(CultureInfo.CurrentUICulture, Environment.GetResourceString("Argument_InvalidToken", tk, this)));
-
- int tkDeclaringType;
- string fieldName;
-
- fieldName = MetadataImport.GetName(tk).ToString();
- tkDeclaringType = MetadataImport.GetParentToken(tk);
-
- Type declaringType = ResolveType(tkDeclaringType, genericTypeArguments, genericMethodArguments);
-
- declaringType.GetFields();
-
- try
- {
- return declaringType.GetField(fieldName,
- BindingFlags.Static | BindingFlags.Instance |
- BindingFlags.Public | BindingFlags.NonPublic |
- BindingFlags.DeclaredOnly);
- }
- catch
- {
- throw new ArgumentException(Environment.GetResourceString("Argument_ResolveField", tk, this), nameof(metadataToken));
- }
- }
-
- public override FieldInfo ResolveField(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments)
- {
- MetadataToken tk = new MetadataToken(metadataToken);
-
- if (!MetadataImport.IsValidToken(tk))
- throw new ArgumentOutOfRangeException(nameof(metadataToken),
- Environment.GetResourceString("Argument_InvalidToken", tk, this));
-
- RuntimeTypeHandle[] typeArgs = ConvertToTypeHandleArray(genericTypeArguments);
- RuntimeTypeHandle[] methodArgs = ConvertToTypeHandleArray(genericMethodArguments);
-
- try
- {
- IRuntimeFieldInfo fieldHandle = null;
-
- if (!tk.IsFieldDef)
- {
- if (!tk.IsMemberRef)
- throw new ArgumentException(Environment.GetResourceString("Argument_ResolveField", tk, this),
- nameof(metadataToken));
-
- unsafe
- {
- ConstArray sig = MetadataImport.GetMemberRefProps(tk);
-
- if (*(MdSigCallingConvention*)sig.Signature.ToPointer() != MdSigCallingConvention.Field)
- throw new ArgumentException(Environment.GetResourceString("Argument_ResolveField", tk, this),
- nameof(metadataToken));
- }
-
- fieldHandle = ModuleHandle.ResolveFieldHandleInternal(GetNativeHandle(), tk, typeArgs, methodArgs);
- }
-
- fieldHandle = ModuleHandle.ResolveFieldHandleInternal(GetNativeHandle(), metadataToken, typeArgs, methodArgs);
- RuntimeType declaringType = RuntimeFieldHandle.GetApproxDeclaringType(fieldHandle.Value);
-
- if (declaringType.IsGenericType || declaringType.IsArray)
- {
- int tkDeclaringType = ModuleHandle.GetMetadataImport(GetNativeHandle()).GetParentToken(metadataToken);
- declaringType = (RuntimeType)ResolveType(tkDeclaringType, genericTypeArguments, genericMethodArguments);
- }
-
- return System.RuntimeType.GetFieldInfo(declaringType, fieldHandle);
- }
- catch (MissingFieldException)
- {
- return ResolveLiteralField(tk, genericTypeArguments, genericMethodArguments);
- }
- catch (BadImageFormatException e)
- {
- throw new ArgumentException(Environment.GetResourceString("Argument_BadImageFormatExceptionResolve"), e);
- }
- }
-
- public override Type ResolveType(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments)
- {
- MetadataToken tk = new MetadataToken(metadataToken);
-
- if (tk.IsGlobalTypeDefToken)
- throw new ArgumentException(Environment.GetResourceString("Argument_ResolveModuleType", tk), nameof(metadataToken));
-
- if (!MetadataImport.IsValidToken(tk))
- throw new ArgumentOutOfRangeException(nameof(metadataToken),
- Environment.GetResourceString("Argument_InvalidToken", tk, this));
-
- if (!tk.IsTypeDef && !tk.IsTypeSpec && !tk.IsTypeRef)
- throw new ArgumentException(Environment.GetResourceString("Argument_ResolveType", tk, this), nameof(metadataToken));
-
- RuntimeTypeHandle[] typeArgs = ConvertToTypeHandleArray(genericTypeArguments);
- RuntimeTypeHandle[] methodArgs = ConvertToTypeHandleArray(genericMethodArguments);
-
- try
- {
- Type t = GetModuleHandle().ResolveTypeHandle(metadataToken, typeArgs, methodArgs).GetRuntimeType();
-
- if (t == null)
- throw new ArgumentException(Environment.GetResourceString("Argument_ResolveType", tk, this), nameof(metadataToken));
-
- return t;
- }
- catch (BadImageFormatException e)
- {
- throw new ArgumentException(Environment.GetResourceString("Argument_BadImageFormatExceptionResolve"), e);
- }
- }
-
- public override MemberInfo ResolveMember(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments)
- {
- MetadataToken tk = new MetadataToken(metadataToken);
-
- if (tk.IsProperty)
- throw new ArgumentException(Environment.GetResourceString("InvalidOperation_PropertyInfoNotAvailable"));
-
- if (tk.IsEvent)
- throw new ArgumentException(Environment.GetResourceString("InvalidOperation_EventInfoNotAvailable"));
-
- if (tk.IsMethodSpec || tk.IsMethodDef)
- return ResolveMethod(metadataToken, genericTypeArguments, genericMethodArguments);
-
- if (tk.IsFieldDef)
- return ResolveField(metadataToken, genericTypeArguments, genericMethodArguments);
-
- if (tk.IsTypeRef || tk.IsTypeDef || tk.IsTypeSpec)
- return ResolveType(metadataToken, genericTypeArguments, genericMethodArguments);
-
- if (tk.IsMemberRef)
- {
- if (!MetadataImport.IsValidToken(tk))
- throw new ArgumentOutOfRangeException(nameof(metadataToken),
- Environment.GetResourceString("Argument_InvalidToken", tk, this));
-
- ConstArray sig = MetadataImport.GetMemberRefProps(tk);
-
- unsafe
- {
- if (*(MdSigCallingConvention*)sig.Signature.ToPointer() == MdSigCallingConvention.Field)
- {
- return ResolveField(tk, genericTypeArguments, genericMethodArguments);
- }
- else
- {
- return ResolveMethod(tk, genericTypeArguments, genericMethodArguments);
- }
- }
- }
-
- throw new ArgumentException(Environment.GetResourceString("Argument_ResolveMember", tk, this),
- nameof(metadataToken));
- }
-
- public override string ResolveString(int metadataToken)
- {
- MetadataToken tk = new MetadataToken(metadataToken);
- if (!tk.IsString)
- throw new ArgumentException(
- String.Format(CultureInfo.CurrentUICulture, Environment.GetResourceString("Argument_ResolveString"), metadataToken, ToString()));
-
- if (!MetadataImport.IsValidToken(tk))
- throw new ArgumentOutOfRangeException(nameof(metadataToken),
- String.Format(CultureInfo.CurrentUICulture, Environment.GetResourceString("Argument_InvalidToken", tk, this)));
-
- string str = MetadataImport.GetUserString(metadataToken);
-
- if (str == null)
- throw new ArgumentException(
- String.Format(CultureInfo.CurrentUICulture, Environment.GetResourceString("Argument_ResolveString"), metadataToken, ToString()));
-
- return str;
- }
-
- public override void GetPEKind(out PortableExecutableKinds peKind, out ImageFileMachine machine)
- {
- ModuleHandle.GetPEKind(GetNativeHandle(), out peKind, out machine);
- }
-
- public override int MDStreamVersion
- {
- get
- {
- return ModuleHandle.GetMDStreamVersion(GetNativeHandle());
- }
- }
- #endregion
-
- #region Data Members
-#pragma warning disable 169
- // If you add any data members, you need to update the native declaration ReflectModuleBaseObject.
- private RuntimeType m_runtimeType;
- private RuntimeAssembly m_runtimeAssembly;
- private IntPtr m_pRefClass;
- private IntPtr m_pData;
- private IntPtr m_pGlobals;
- private IntPtr m_pFields;
-#pragma warning restore 169
- #endregion
-
- #region Protected Virtuals
- protected override MethodInfo GetMethodImpl(String name, BindingFlags bindingAttr, Binder binder,
- CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers)
- {
- return GetMethodInternal(name, bindingAttr, binder, callConvention, types, modifiers);
- }
-
- internal MethodInfo GetMethodInternal(String name, BindingFlags bindingAttr, Binder binder,
- CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers)
- {
- if (RuntimeType == null)
- return null;
-
- if (types == null)
- {
- return RuntimeType.GetMethod(name, bindingAttr);
- }
- else
- {
- return RuntimeType.GetMethod(name, bindingAttr, binder, callConvention, types, modifiers);
- }
- }
- #endregion
-
- #region Internal Members
- internal RuntimeType RuntimeType
- {
- get
- {
- if (m_runtimeType == null)
- m_runtimeType = ModuleHandle.GetModuleType(GetNativeHandle());
-
- return m_runtimeType;
- }
- }
-
- internal bool IsTransientInternal()
- {
- return RuntimeModule.nIsTransientInternal(this.GetNativeHandle());
- }
-
- internal MetadataImport MetadataImport
- {
- get
- {
- unsafe
- {
- return ModuleHandle.GetMetadataImport(GetNativeHandle());
- }
- }
- }
- #endregion
-
- #region ICustomAttributeProvider Members
- public override Object[] GetCustomAttributes(bool inherit)
- {
- return CustomAttribute.GetCustomAttributes(this, typeof(object) as RuntimeType);
- }
-
- public override Object[] GetCustomAttributes(Type attributeType, bool inherit)
- {
- if (attributeType == null)
- throw new ArgumentNullException(nameof(attributeType));
- Contract.EndContractBlock();
-
- RuntimeType attributeRuntimeType = attributeType.UnderlyingSystemType as RuntimeType;
-
- if (attributeRuntimeType == null)
- throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"), nameof(attributeType));
-
- return CustomAttribute.GetCustomAttributes(this, attributeRuntimeType);
- }
-
- public override bool IsDefined(Type attributeType, bool inherit)
- {
- if (attributeType == null)
- throw new ArgumentNullException(nameof(attributeType));
- Contract.EndContractBlock();
-
- RuntimeType attributeRuntimeType = attributeType.UnderlyingSystemType as RuntimeType;
-
- if (attributeRuntimeType == null)
- throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"), nameof(attributeType));
-
- return CustomAttribute.IsDefined(this, attributeRuntimeType);
- }
-
- public override IList<CustomAttributeData> GetCustomAttributesData()
- {
- return CustomAttributeData.GetCustomAttributesInternal(this);
- }
- #endregion
-
- #region Public Virtuals
- public override void GetObjectData(SerializationInfo info, StreamingContext context)
- {
- if (info == null)
- {
- throw new ArgumentNullException(nameof(info));
- }
- Contract.EndContractBlock();
- UnitySerializationHolder.GetUnitySerializationInfo(info, UnitySerializationHolder.ModuleUnity, this.ScopeName, this.GetRuntimeAssembly());
- }
-
- public override Type GetType(String className, bool throwOnError, bool ignoreCase)
- {
- // throw on null strings regardless of the value of "throwOnError"
- if (className == null)
- throw new ArgumentNullException(nameof(className));
-
- RuntimeType retType = null;
- Object keepAlive = null;
- GetType(GetNativeHandle(), className, throwOnError, ignoreCase, JitHelpers.GetObjectHandleOnStack(ref retType), JitHelpers.GetObjectHandleOnStack(ref keepAlive));
- GC.KeepAlive(keepAlive);
- return retType;
- }
-
- internal string GetFullyQualifiedName()
- {
- String fullyQualifiedName = null;
- GetFullyQualifiedName(GetNativeHandle(), JitHelpers.GetStringHandleOnStack(ref fullyQualifiedName));
- return fullyQualifiedName;
- }
-
- public override String FullyQualifiedName
- {
- get
- {
- return GetFullyQualifiedName();
- }
- }
-
- public override Type[] GetTypes()
- {
- return GetTypes(GetNativeHandle());
- }
-
- #endregion
-
- #region Public Members
-
- public override Guid ModuleVersionId
- {
- get
- {
- unsafe
- {
- Guid mvid;
- MetadataImport.GetScopeProps(out mvid);
- return mvid;
- }
- }
- }
-
- public override int MetadataToken
- {
- get
- {
- return ModuleHandle.GetToken(GetNativeHandle());
- }
- }
-
- public override bool IsResource()
- {
- return IsResource(GetNativeHandle());
- }
-
- public override FieldInfo[] GetFields(BindingFlags bindingFlags)
- {
- if (RuntimeType == null)
- return new FieldInfo[0];
-
- return RuntimeType.GetFields(bindingFlags);
- }
-
- public override FieldInfo GetField(String name, BindingFlags bindingAttr)
- {
- if (name == null)
- throw new ArgumentNullException(nameof(name));
-
- if (RuntimeType == null)
- return null;
-
- return RuntimeType.GetField(name, bindingAttr);
- }
-
- public override MethodInfo[] GetMethods(BindingFlags bindingFlags)
- {
- if (RuntimeType == null)
- return new MethodInfo[0];
-
- return RuntimeType.GetMethods(bindingFlags);
- }
-
- public override String ScopeName
- {
- get
- {
- string scopeName = null;
- GetScopeName(GetNativeHandle(), JitHelpers.GetStringHandleOnStack(ref scopeName));
- return scopeName;
- }
- }
-
- public override String Name
- {
- get
- {
- String s = GetFullyQualifiedName();
-
-#if !FEATURE_PAL
- int i = s.LastIndexOf('\\');
-#else
- int i = s.LastIndexOf(System.IO.Path.DirectorySeparatorChar);
-#endif
- if (i == -1)
- return s;
-
- return s.Substring(i + 1);
- }
- }
-
- public override Assembly Assembly
- {
- [Pure]
- get
- {
- return GetRuntimeAssembly();
- }
- }
-
- internal RuntimeAssembly GetRuntimeAssembly()
- {
- return m_runtimeAssembly;
- }
-
-
- internal override ModuleHandle GetModuleHandle()
- {
- return new ModuleHandle(this);
- }
-
- internal RuntimeModule GetNativeHandle()
- {
- return this;
- }
- #endregion
- }
}
--- /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.
+
+namespace System.Reflection
+{
+ [Serializable]
+ public delegate Module ModuleResolveEventHandler(Object sender, ResolveEventArgs e);
+}
// 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.Collections.Generic;
+using System.Diagnostics.Contracts;
+using System.Runtime.Serialization;
namespace System.Reflection
{
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.Diagnostics.Contracts;
- using System.Runtime.InteropServices;
- using System.Runtime.Serialization;
- using System.Runtime.CompilerServices;
- using System.Threading;
- using MdToken = System.Reflection.MetadataToken;
-
[Serializable]
public class ParameterInfo : ICustomAttributeProvider, IObjectReference
{
}
#endregion
}
-
- [Serializable]
- internal unsafe sealed class RuntimeParameterInfo : ParameterInfo, ISerializable
- {
- #region Static Members
- internal unsafe static ParameterInfo[] GetParameters(IRuntimeMethodInfo method, MemberInfo member, Signature sig)
- {
- Debug.Assert(method is RuntimeMethodInfo || method is RuntimeConstructorInfo);
-
- ParameterInfo dummy;
- return GetParameters(method, member, sig, out dummy, false);
- }
-
- internal unsafe static ParameterInfo GetReturnParameter(IRuntimeMethodInfo method, MemberInfo member, Signature sig)
- {
- Debug.Assert(method is RuntimeMethodInfo || method is RuntimeConstructorInfo);
-
- ParameterInfo returnParameter;
- GetParameters(method, member, sig, out returnParameter, true);
- return returnParameter;
- }
-
- internal unsafe static ParameterInfo[] GetParameters(
- IRuntimeMethodInfo methodHandle, MemberInfo member, Signature sig, out ParameterInfo returnParameter, bool fetchReturnParameter)
- {
- returnParameter = null;
- int sigArgCount = sig.Arguments.Length;
- ParameterInfo[] args = fetchReturnParameter ? null : new ParameterInfo[sigArgCount];
-
- int tkMethodDef = RuntimeMethodHandle.GetMethodDef(methodHandle);
- int cParamDefs = 0;
-
- // Not all methods have tokens. Arrays, pointers and byRef types do not have tokens as they
- // are generated on the fly by the runtime.
- if (!MdToken.IsNullToken(tkMethodDef))
- {
- MetadataImport scope = RuntimeTypeHandle.GetMetadataImport(RuntimeMethodHandle.GetDeclaringType(methodHandle));
-
- MetadataEnumResult tkParamDefs;
- scope.EnumParams(tkMethodDef, out tkParamDefs);
-
- cParamDefs = tkParamDefs.Length;
-
- // Not all parameters have tokens. Parameters may have no token
- // if they have no name and no attributes.
- if (cParamDefs > sigArgCount + 1 /* return type */)
- throw new BadImageFormatException(Environment.GetResourceString("BadImageFormat_ParameterSignatureMismatch"));
-
- for (int i = 0; i < cParamDefs; i++)
- {
- #region Populate ParameterInfos
- ParameterAttributes attr;
- int position, tkParamDef = tkParamDefs[i];
-
- scope.GetParamDefProps(tkParamDef, out position, out attr);
-
- position--;
-
- if (fetchReturnParameter == true && position == -1)
- {
- // more than one return parameter?
- if (returnParameter != null)
- throw new BadImageFormatException(Environment.GetResourceString("BadImageFormat_ParameterSignatureMismatch"));
-
- returnParameter = new RuntimeParameterInfo(sig, scope, tkParamDef, position, attr, member);
- }
- else if (fetchReturnParameter == false && position >= 0)
- {
- // position beyong sigArgCount?
- if (position >= sigArgCount)
- throw new BadImageFormatException(Environment.GetResourceString("BadImageFormat_ParameterSignatureMismatch"));
-
- args[position] = new RuntimeParameterInfo(sig, scope, tkParamDef, position, attr, member);
- }
- #endregion
- }
- }
-
- // Fill in empty ParameterInfos for those without tokens
- if (fetchReturnParameter)
- {
- if (returnParameter == null)
- {
- returnParameter = new RuntimeParameterInfo(sig, MetadataImport.EmptyImport, 0, -1, (ParameterAttributes)0, member);
- }
- }
- else
- {
- if (cParamDefs < args.Length + 1)
- {
- for (int i = 0; i < args.Length; i++)
- {
- if (args[i] != null)
- continue;
-
- args[i] = new RuntimeParameterInfo(sig, MetadataImport.EmptyImport, 0, i, (ParameterAttributes)0, member);
- }
- }
- }
-
- return args;
- }
- #endregion
-
- #region Private Statics
- private static readonly Type s_DecimalConstantAttributeType = typeof(DecimalConstantAttribute);
- private static readonly Type s_CustomConstantAttributeType = typeof(CustomConstantAttribute);
- #endregion
-
- #region Private Data Members
- // These are new in Whidbey, so we cannot serialize them directly or we break backwards compatibility.
- [NonSerialized]
- private int m_tkParamDef;
- [NonSerialized]
- private MetadataImport m_scope;
- [NonSerialized]
- private Signature m_signature;
- [NonSerialized]
- private volatile bool m_nameIsCached = false;
- [NonSerialized]
- private readonly bool m_noMetadata = false;
- [NonSerialized]
- private bool m_noDefaultValue = false;
- [NonSerialized]
- private MethodBase m_originalMember = null;
- #endregion
-
- #region Internal Properties
- internal MethodBase DefiningMethod
- {
- get
- {
- MethodBase result = m_originalMember != null ? m_originalMember : MemberImpl as MethodBase;
- Debug.Assert(result != null);
- return result;
- }
- }
- #endregion
-
- #region VTS magic to serialize/deserialized to/from pre-Whidbey endpoints.
- public void GetObjectData(SerializationInfo info, StreamingContext context)
- {
- if (info == null)
- throw new ArgumentNullException(nameof(info));
- Contract.EndContractBlock();
-
- // We could be serializing for consumption by a pre-Whidbey
- // endpoint. Therefore we set up all the serialized fields to look
- // just like a v1.0/v1.1 instance.
-
- // Need to set the type to ParameterInfo so that pre-Whidbey and Whidbey code
- // can deserialize this. This is also why we cannot simply use [OnSerializing].
- info.SetType(typeof(ParameterInfo));
-
- // Use the properties intead of the fields in case the fields haven't been et
- // _importer, bExtraConstChecked, and m_cachedData don't need to be set
-
- // Now set the legacy fields that the current implementation doesn't
- // use any more. Note that _importer is a raw pointer that should
- // never have been serialized in V1. We set it to zero here; if the
- // deserializer uses it (by calling GetCustomAttributes() on this
- // instance) they'll AV, but at least it will be a well defined
- // exception and not a random AV.
-
- info.AddValue("AttrsImpl", Attributes);
- info.AddValue("ClassImpl", ParameterType);
- info.AddValue("DefaultValueImpl", DefaultValue);
- info.AddValue("MemberImpl", Member);
- info.AddValue("NameImpl", Name);
- info.AddValue("PositionImpl", Position);
- info.AddValue("_token", m_tkParamDef);
- }
- #endregion
-
- #region Constructor
- // used by RuntimePropertyInfo
- internal RuntimeParameterInfo(RuntimeParameterInfo accessor, RuntimePropertyInfo property)
- : this(accessor, (MemberInfo)property)
- {
- m_signature = property.Signature;
- }
-
- private RuntimeParameterInfo(RuntimeParameterInfo accessor, MemberInfo member)
- {
- // Change ownership
- MemberImpl = member;
-
- // The original owner should always be a method, because this method is only used to
- // change the owner from a method to a property.
- m_originalMember = accessor.MemberImpl as MethodBase;
- Debug.Assert(m_originalMember != null);
-
- // Populate all the caches -- we inherit this behavior from RTM
- NameImpl = accessor.Name;
- m_nameIsCached = true;
- ClassImpl = accessor.ParameterType;
- PositionImpl = accessor.Position;
- AttrsImpl = accessor.Attributes;
-
- // Strictly speeking, property's don't contain paramter tokens
- // However we need this to make ca's work... oh well...
- m_tkParamDef = MdToken.IsNullToken(accessor.MetadataToken) ? (int)MetadataTokenType.ParamDef : accessor.MetadataToken;
- m_scope = accessor.m_scope;
- }
-
- private RuntimeParameterInfo(
- Signature signature, MetadataImport scope, int tkParamDef,
- int position, ParameterAttributes attributes, MemberInfo member)
- {
- Contract.Requires(member != null);
- Debug.Assert(MdToken.IsNullToken(tkParamDef) == scope.Equals(MetadataImport.EmptyImport));
- Debug.Assert(MdToken.IsNullToken(tkParamDef) || MdToken.IsTokenOfType(tkParamDef, MetadataTokenType.ParamDef));
-
- PositionImpl = position;
- MemberImpl = member;
- m_signature = signature;
- m_tkParamDef = MdToken.IsNullToken(tkParamDef) ? (int)MetadataTokenType.ParamDef : tkParamDef;
- m_scope = scope;
- AttrsImpl = attributes;
-
- ClassImpl = null;
- NameImpl = null;
- }
-
- // ctor for no metadata MethodInfo in the DynamicMethod and RuntimeMethodInfo cases
- internal RuntimeParameterInfo(MethodInfo owner, String name, Type parameterType, int position)
- {
- MemberImpl = owner;
- NameImpl = name;
- m_nameIsCached = true;
- m_noMetadata = true;
- ClassImpl = parameterType;
- PositionImpl = position;
- AttrsImpl = ParameterAttributes.None;
- m_tkParamDef = (int)MetadataTokenType.ParamDef;
- m_scope = MetadataImport.EmptyImport;
- }
- #endregion
-
- #region Public Methods
- public override Type ParameterType
- {
- get
- {
- // only instance of ParameterInfo has ClassImpl, all its subclasses don't
- if (ClassImpl == null)
- {
- RuntimeType parameterType;
- if (PositionImpl == -1)
- parameterType = m_signature.ReturnType;
- else
- parameterType = m_signature.Arguments[PositionImpl];
-
- Debug.Assert(parameterType != null);
- // different thread could only write ClassImpl to the same value, so a race condition is not a problem here
- ClassImpl = parameterType;
- }
-
- return ClassImpl;
- }
- }
-
- public override String Name
- {
- get
- {
- if (!m_nameIsCached)
- {
- if (!MdToken.IsNullToken(m_tkParamDef))
- {
- string name;
- name = m_scope.GetName(m_tkParamDef).ToString();
- NameImpl = name;
- }
-
- // other threads could only write it to true, so a race condition is OK
- // this field is volatile, so the write ordering is guaranteed
- m_nameIsCached = true;
- }
-
- // name may be null
- return NameImpl;
- }
- }
-
- public override bool HasDefaultValue
- {
- get
- {
- if (m_noMetadata || m_noDefaultValue)
- return false;
-
- object defaultValue = GetDefaultValueInternal(false);
-
- return (defaultValue != DBNull.Value);
- }
- }
-
- public override Object DefaultValue { get { return GetDefaultValue(false); } }
- public override Object RawDefaultValue { get { return GetDefaultValue(true); } }
-
- private Object GetDefaultValue(bool raw)
- {
- // OLD COMMENT (Is this even true?)
- // Cannot cache because default value could be non-agile user defined enumeration.
- // OLD COMMENT ends
- if (m_noMetadata)
- return null;
-
- // for dynamic method we pretend to have cached the value so we do not go to metadata
- object defaultValue = GetDefaultValueInternal(raw);
-
- if (defaultValue == DBNull.Value)
- {
- #region Handle case if no default value was found
- if (IsOptional)
- {
- // If the argument is marked as optional then the default value is Missing.Value.
- defaultValue = Type.Missing;
- }
- #endregion
- }
-
- return defaultValue;
- }
-
- // returns DBNull.Value if the parameter doesn't have a default value
- private Object GetDefaultValueInternal(bool raw)
- {
- Debug.Assert(!m_noMetadata);
-
- if (m_noDefaultValue)
- return DBNull.Value;
-
- object defaultValue = null;
-
- // Why check the parameter type only for DateTime and only for the ctor arguments?
- // No check on the parameter type is done for named args and for Decimal.
-
- // We should move this after MdToken.IsNullToken(m_tkParamDef) and combine it
- // with the other custom attribute logic. But will that be a breaking change?
- // For a DateTime parameter on which both an md constant and a ca constant are set,
- // which one should win?
- if (ParameterType == typeof(DateTime))
- {
- if (raw)
- {
- CustomAttributeTypedArgument value =
- CustomAttributeData.Filter(
- CustomAttributeData.GetCustomAttributes(this), typeof(DateTimeConstantAttribute), 0);
-
- if (value.ArgumentType != null)
- return new DateTime((long)value.Value);
- }
- else
- {
- object[] dt = GetCustomAttributes(typeof(DateTimeConstantAttribute), false);
- if (dt != null && dt.Length != 0)
- return ((DateTimeConstantAttribute)dt[0]).Value;
- }
- }
-
- #region Look for a default value in metadata
- if (!MdToken.IsNullToken(m_tkParamDef))
- {
- // This will return DBNull.Value if no constant value is defined on m_tkParamDef in the metadata.
- defaultValue = MdConstant.GetValue(m_scope, m_tkParamDef, ParameterType.GetTypeHandleInternal(), raw);
- }
- #endregion
-
- if (defaultValue == DBNull.Value)
- {
- #region Look for a default value in the custom attributes
- if (raw)
- {
- foreach (CustomAttributeData attr in CustomAttributeData.GetCustomAttributes(this))
- {
- Type attrType = attr.Constructor.DeclaringType;
-
- if (attrType == typeof(DateTimeConstantAttribute))
- {
- defaultValue = DateTimeConstantAttribute.GetRawDateTimeConstant(attr);
- }
- else if (attrType == typeof(DecimalConstantAttribute))
- {
- defaultValue = DecimalConstantAttribute.GetRawDecimalConstant(attr);
- }
- else if (attrType.IsSubclassOf(s_CustomConstantAttributeType))
- {
- defaultValue = CustomConstantAttribute.GetRawConstant(attr);
- }
- }
- }
- else
- {
- Object[] CustomAttrs = GetCustomAttributes(s_CustomConstantAttributeType, false);
- if (CustomAttrs.Length != 0)
- {
- defaultValue = ((CustomConstantAttribute)CustomAttrs[0]).Value;
- }
- else
- {
- CustomAttrs = GetCustomAttributes(s_DecimalConstantAttributeType, false);
- if (CustomAttrs.Length != 0)
- {
- defaultValue = ((DecimalConstantAttribute)CustomAttrs[0]).Value;
- }
- }
- }
- #endregion
- }
-
- if (defaultValue == DBNull.Value)
- m_noDefaultValue = true;
-
- return defaultValue;
- }
-
- internal RuntimeModule GetRuntimeModule()
- {
- RuntimeMethodInfo method = Member as RuntimeMethodInfo;
- RuntimeConstructorInfo constructor = Member as RuntimeConstructorInfo;
- RuntimePropertyInfo property = Member as RuntimePropertyInfo;
-
- if (method != null)
- return method.GetRuntimeModule();
- else if (constructor != null)
- return constructor.GetRuntimeModule();
- else if (property != null)
- return property.GetRuntimeModule();
- else
- return null;
- }
-
- public override int MetadataToken
- {
- get
- {
- return m_tkParamDef;
- }
- }
-
- public override Type[] GetRequiredCustomModifiers()
- {
- return m_signature.GetCustomModifiers(PositionImpl + 1, true);
- }
-
- public override Type[] GetOptionalCustomModifiers()
- {
- return m_signature.GetCustomModifiers(PositionImpl + 1, false);
- }
-
- #endregion
-
- #region ICustomAttributeProvider
- public override Object[] GetCustomAttributes(bool inherit)
- {
- if (MdToken.IsNullToken(m_tkParamDef))
- return EmptyArray<Object>.Value;
-
- return CustomAttribute.GetCustomAttributes(this, typeof(object) as RuntimeType);
- }
-
- public override Object[] GetCustomAttributes(Type attributeType, bool inherit)
- {
- if (attributeType == null)
- throw new ArgumentNullException(nameof(attributeType));
- Contract.EndContractBlock();
-
- if (MdToken.IsNullToken(m_tkParamDef))
- return EmptyArray<Object>.Value;
-
- RuntimeType attributeRuntimeType = attributeType.UnderlyingSystemType as RuntimeType;
-
- if (attributeRuntimeType == null)
- throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"), nameof(attributeType));
-
- return CustomAttribute.GetCustomAttributes(this, attributeRuntimeType);
- }
-
- public override bool IsDefined(Type attributeType, bool inherit)
- {
- if (attributeType == null)
- throw new ArgumentNullException(nameof(attributeType));
- Contract.EndContractBlock();
-
- if (MdToken.IsNullToken(m_tkParamDef))
- return false;
-
- RuntimeType attributeRuntimeType = attributeType.UnderlyingSystemType as RuntimeType;
-
- if (attributeRuntimeType == null)
- throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"), nameof(attributeType));
-
- return CustomAttribute.IsDefined(this, attributeRuntimeType);
- }
-
- public override IList<CustomAttributeData> GetCustomAttributesData()
- {
- return CustomAttributeData.GetCustomAttributesInternal(this);
- }
- #endregion
- }
}
--- /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.
+
+namespace System.Reflection
+{
+ [Flags]
+ [Serializable]
+ public enum PortableExecutableKinds
+ {
+ NotAPortableExecutableImage = 0x0,
+ ILOnly = 0x1,
+ Required32Bit = 0x2,
+ PE32Plus = 0x4,
+ Unmanaged32Bit = 0x8,
+ Preferred32Bit = 0x10,
+ }
+}
// 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.Globalization;
namespace System.Reflection
{
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.Diagnostics.Contracts;
- using System.Globalization;
- using System.Runtime;
- using System.Runtime.ConstrainedExecution;
- using System.Runtime.InteropServices;
- using System.Runtime.Serialization;
- using System.Text;
- using RuntimeTypeCache = System.RuntimeType.RuntimeTypeCache;
-
[Serializable]
public abstract class PropertyInfo : MemberInfo
{
public bool IsSpecialName { get { return (Attributes & PropertyAttributes.SpecialName) != 0; } }
#endregion
}
-
- [Serializable]
- internal unsafe sealed class RuntimePropertyInfo : PropertyInfo, ISerializable
- {
- #region Private Data Members
- private int m_token;
- private string m_name;
- private void* m_utf8name;
- private PropertyAttributes m_flags;
- private RuntimeTypeCache m_reflectedTypeCache;
- private RuntimeMethodInfo m_getterMethod;
- private RuntimeMethodInfo m_setterMethod;
- private MethodInfo[] m_otherMethod;
- private RuntimeType m_declaringType;
- private BindingFlags m_bindingFlags;
- private Signature m_signature;
- private ParameterInfo[] m_parameters;
- #endregion
-
- #region Constructor
- internal RuntimePropertyInfo(
- int tkProperty, RuntimeType declaredType, RuntimeTypeCache reflectedTypeCache, out bool isPrivate)
- {
- Contract.Requires(declaredType != null);
- Contract.Requires(reflectedTypeCache != null);
- Debug.Assert(!reflectedTypeCache.IsGlobal);
-
- MetadataImport scope = declaredType.GetRuntimeModule().MetadataImport;
-
- m_token = tkProperty;
- m_reflectedTypeCache = reflectedTypeCache;
- m_declaringType = declaredType;
-
- ConstArray sig;
- scope.GetPropertyProps(tkProperty, out m_utf8name, out m_flags, out sig);
-
- RuntimeMethodInfo dummy;
- Associates.AssignAssociates(scope, tkProperty, declaredType, reflectedTypeCache.GetRuntimeType(),
- out dummy, out dummy, out dummy,
- out m_getterMethod, out m_setterMethod, out m_otherMethod,
- out isPrivate, out m_bindingFlags);
- }
- #endregion
-
- #region Internal Members
- internal override bool CacheEquals(object o)
- {
- RuntimePropertyInfo m = o as RuntimePropertyInfo;
-
- if ((object)m == null)
- return false;
-
- return m.m_token == m_token &&
- RuntimeTypeHandle.GetModule(m_declaringType).Equals(
- RuntimeTypeHandle.GetModule(m.m_declaringType));
- }
-
- internal Signature Signature
- {
- get
- {
- if (m_signature == null)
- {
- PropertyAttributes flags;
- ConstArray sig;
-
- void* name;
- GetRuntimeModule().MetadataImport.GetPropertyProps(
- m_token, out name, out flags, out sig);
-
- m_signature = new Signature(sig.Signature.ToPointer(), (int)sig.Length, m_declaringType);
- }
-
- return m_signature;
- }
- }
- internal bool EqualsSig(RuntimePropertyInfo target)
- {
- //@Asymmetry - Legacy policy is to remove duplicate properties, including hidden properties.
- // The comparison is done by name and by sig. The EqualsSig comparison is expensive
- // but forutnetly it is only called when an inherited property is hidden by name or
- // when an interfaces declare properies with the same signature.
- // Note that we intentionally don't resolve generic arguments so that we don't treat
- // signatures that only match in certain instantiations as duplicates. This has the
- // down side of treating overriding and overriden properties as different properties
- // in some cases. But PopulateProperties in rttype.cs should have taken care of that
- // by comparing VTable slots.
- //
- // Class C1(Of T, Y)
- // Property Prop1(ByVal t1 As T) As Integer
- // Get
- // ... ...
- // End Get
- // End Property
- // Property Prop1(ByVal y1 As Y) As Integer
- // Get
- // ... ...
- // End Get
- // End Property
- // End Class
- //
-
- Contract.Requires(Name.Equals(target.Name));
- Contract.Requires(this != target);
- Contract.Requires(this.ReflectedType == target.ReflectedType);
-
- return Signature.CompareSig(this.Signature, target.Signature);
- }
- internal BindingFlags BindingFlags { get { return m_bindingFlags; } }
- #endregion
-
- #region Object Overrides
- public override String ToString()
- {
- return FormatNameAndSig(false);
- }
-
- private string FormatNameAndSig(bool serialization)
- {
- StringBuilder sbName = new StringBuilder(PropertyType.FormatTypeName(serialization));
-
- sbName.Append(" ");
- sbName.Append(Name);
-
- RuntimeType[] arguments = Signature.Arguments;
- if (arguments.Length > 0)
- {
- sbName.Append(" [");
- sbName.Append(MethodBase.ConstructParameters(arguments, Signature.CallingConvention, serialization));
- sbName.Append("]");
- }
-
- return sbName.ToString();
- }
- #endregion
-
- #region ICustomAttributeProvider
- public override Object[] GetCustomAttributes(bool inherit)
- {
- return CustomAttribute.GetCustomAttributes(this, typeof(object) as RuntimeType);
- }
-
- public override Object[] GetCustomAttributes(Type attributeType, bool inherit)
- {
- if (attributeType == null)
- throw new ArgumentNullException(nameof(attributeType));
- Contract.EndContractBlock();
-
- RuntimeType attributeRuntimeType = attributeType.UnderlyingSystemType as RuntimeType;
-
- if (attributeRuntimeType == null)
- throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"), nameof(attributeType));
-
- return CustomAttribute.GetCustomAttributes(this, attributeRuntimeType);
- }
-
- public override bool IsDefined(Type attributeType, bool inherit)
- {
- if (attributeType == null)
- throw new ArgumentNullException(nameof(attributeType));
- Contract.EndContractBlock();
-
- RuntimeType attributeRuntimeType = attributeType.UnderlyingSystemType as RuntimeType;
-
- if (attributeRuntimeType == null)
- throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"), nameof(attributeType));
-
- return CustomAttribute.IsDefined(this, attributeRuntimeType);
- }
-
- public override IList<CustomAttributeData> GetCustomAttributesData()
- {
- return CustomAttributeData.GetCustomAttributesInternal(this);
- }
- #endregion
-
- #region MemberInfo Overrides
- public override MemberTypes MemberType { get { return MemberTypes.Property; } }
- public override String Name
- {
- get
- {
- if (m_name == null)
- m_name = new Utf8String(m_utf8name).ToString();
-
- return m_name;
- }
- }
- public override Type DeclaringType
- {
- get
- {
- return m_declaringType;
- }
- }
-
- public override Type ReflectedType
- {
- get
- {
- return ReflectedTypeInternal;
- }
- }
-
- private RuntimeType ReflectedTypeInternal
- {
- get
- {
- return m_reflectedTypeCache.GetRuntimeType();
- }
- }
-
- public override int MetadataToken { get { return m_token; } }
-
- public override Module Module { get { return GetRuntimeModule(); } }
- internal RuntimeModule GetRuntimeModule() { return m_declaringType.GetRuntimeModule(); }
- #endregion
-
- #region PropertyInfo Overrides
-
- #region Non Dynamic
-
- public override Type[] GetRequiredCustomModifiers()
- {
- return Signature.GetCustomModifiers(0, true);
- }
-
- public override Type[] GetOptionalCustomModifiers()
- {
- return Signature.GetCustomModifiers(0, false);
- }
-
- internal object GetConstantValue(bool raw)
- {
- Object defaultValue = MdConstant.GetValue(GetRuntimeModule().MetadataImport, m_token, PropertyType.GetTypeHandleInternal(), raw);
-
- if (defaultValue == DBNull.Value)
- // Arg_EnumLitValueNotFound -> "Literal value was not found."
- throw new InvalidOperationException(Environment.GetResourceString("Arg_EnumLitValueNotFound"));
-
- return defaultValue;
- }
-
- public override object GetConstantValue() { return GetConstantValue(false); }
-
- public override object GetRawConstantValue() { return GetConstantValue(true); }
-
- public override MethodInfo[] GetAccessors(bool nonPublic)
- {
- List<MethodInfo> accessorList = new List<MethodInfo>();
-
- if (Associates.IncludeAccessor(m_getterMethod, nonPublic))
- accessorList.Add(m_getterMethod);
-
- if (Associates.IncludeAccessor(m_setterMethod, nonPublic))
- accessorList.Add(m_setterMethod);
-
- if ((object)m_otherMethod != null)
- {
- for (int i = 0; i < m_otherMethod.Length; i++)
- {
- if (Associates.IncludeAccessor(m_otherMethod[i] as MethodInfo, nonPublic))
- accessorList.Add(m_otherMethod[i]);
- }
- }
- return accessorList.ToArray();
- }
-
- public override Type PropertyType
- {
- get { return Signature.ReturnType; }
- }
-
- public override MethodInfo GetGetMethod(bool nonPublic)
- {
- if (!Associates.IncludeAccessor(m_getterMethod, nonPublic))
- return null;
-
- return m_getterMethod;
- }
-
- public override MethodInfo GetSetMethod(bool nonPublic)
- {
- if (!Associates.IncludeAccessor(m_setterMethod, nonPublic))
- return null;
-
- return m_setterMethod;
- }
-
- public override ParameterInfo[] GetIndexParameters()
- {
- ParameterInfo[] indexParams = GetIndexParametersNoCopy();
-
- int numParams = indexParams.Length;
-
- if (numParams == 0)
- return indexParams;
-
- ParameterInfo[] ret = new ParameterInfo[numParams];
-
- Array.Copy(indexParams, ret, numParams);
-
- return ret;
- }
-
- internal ParameterInfo[] GetIndexParametersNoCopy()
- {
- // @History - Logic ported from RTM
-
- // No need to lock because we don't guarantee the uniqueness of ParameterInfo objects
- if (m_parameters == null)
- {
- int numParams = 0;
- ParameterInfo[] methParams = null;
-
- // First try to get the Get method.
- MethodInfo m = GetGetMethod(true);
- if (m != null)
- {
- // There is a Get method so use it.
- methParams = m.GetParametersNoCopy();
- numParams = methParams.Length;
- }
- else
- {
- // If there is no Get method then use the Set method.
- m = GetSetMethod(true);
-
- if (m != null)
- {
- methParams = m.GetParametersNoCopy();
- numParams = methParams.Length - 1;
- }
- }
-
- // Now copy over the parameter info's and change their
- // owning member info to the current property info.
-
- ParameterInfo[] propParams = new ParameterInfo[numParams];
-
- for (int i = 0; i < numParams; i++)
- propParams[i] = new RuntimeParameterInfo((RuntimeParameterInfo)methParams[i], this);
-
- m_parameters = propParams;
- }
-
- return m_parameters;
- }
-
- public override PropertyAttributes Attributes
- {
- get
- {
- return m_flags;
- }
- }
-
- public override bool CanRead
- {
- get
- {
- return m_getterMethod != null;
- }
- }
-
- public override bool CanWrite
- {
- get
- {
- return m_setterMethod != null;
- }
- }
- #endregion
-
- #region Dynamic
- [DebuggerStepThroughAttribute]
- [Diagnostics.DebuggerHidden]
- public override Object GetValue(Object obj, Object[] index)
- {
- return GetValue(obj, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static,
- null, index, null);
- }
-
- [DebuggerStepThroughAttribute]
- [Diagnostics.DebuggerHidden]
- public override Object GetValue(Object obj, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture)
- {
- MethodInfo m = GetGetMethod(true);
- if (m == null)
- throw new ArgumentException(System.Environment.GetResourceString("Arg_GetMethNotFnd"));
- return m.Invoke(obj, invokeAttr, binder, index, null);
- }
-
- [DebuggerStepThroughAttribute]
- [Diagnostics.DebuggerHidden]
- public override void SetValue(Object obj, Object value, Object[] index)
- {
- SetValue(obj,
- value,
- BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static,
- null,
- index,
- null);
- }
-
- [DebuggerStepThroughAttribute]
- [Diagnostics.DebuggerHidden]
- public override void SetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture)
- {
- MethodInfo m = GetSetMethod(true);
-
- if (m == null)
- throw new ArgumentException(System.Environment.GetResourceString("Arg_SetMethNotFnd"));
-
- Object[] args = null;
-
- if (index != null)
- {
- args = new Object[index.Length + 1];
-
- for (int i = 0; i < index.Length; i++)
- args[i] = index[i];
-
- args[index.Length] = value;
- }
- else
- {
- args = new Object[1];
- args[0] = value;
- }
-
- m.Invoke(obj, invokeAttr, binder, args, culture);
- }
- #endregion
-
- #endregion
-
- #region ISerializable Implementation
- public void GetObjectData(SerializationInfo info, StreamingContext context)
- {
- if (info == null)
- throw new ArgumentNullException(nameof(info));
- Contract.EndContractBlock();
-
- MemberInfoSerializationHolder.GetSerializationInfo(
- info,
- Name,
- ReflectedTypeInternal,
- ToString(),
- SerializationToString(),
- MemberTypes.Property,
- null);
- }
-
- internal string SerializationToString()
- {
- return FormatNameAndSig(true);
- }
- #endregion
- }
}
--- /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.Diagnostics.Contracts;
+using System.Globalization;
+using System.Runtime.CompilerServices;
+using System.Threading;
+using RuntimeTypeCache = System.RuntimeType.RuntimeTypeCache;
+
+namespace System.Reflection
+{
+ [Serializable]
+ internal unsafe sealed class RtFieldInfo : RuntimeFieldInfo, IRuntimeFieldInfo
+ {
+ #region FCalls
+ [MethodImplAttribute(MethodImplOptions.InternalCall)]
+ static private extern void PerformVisibilityCheckOnField(IntPtr field, Object target, RuntimeType declaringType, FieldAttributes attr, uint invocationFlags);
+ #endregion
+
+ #region Private Data Members
+ // agressive caching
+ private IntPtr m_fieldHandle;
+ private FieldAttributes m_fieldAttributes;
+ // lazy caching
+ private string m_name;
+ private RuntimeType m_fieldType;
+ private INVOCATION_FLAGS m_invocationFlags;
+
+ internal INVOCATION_FLAGS InvocationFlags
+ {
+ get
+ {
+ if ((m_invocationFlags & INVOCATION_FLAGS.INVOCATION_FLAGS_INITIALIZED) == 0)
+ {
+ Type declaringType = DeclaringType;
+ bool fIsReflectionOnlyType = (declaringType is ReflectionOnlyType);
+
+ INVOCATION_FLAGS invocationFlags = 0;
+
+ // first take care of all the NO_INVOKE cases
+ if (
+ (declaringType != null && declaringType.ContainsGenericParameters) ||
+ (declaringType == null && Module.Assembly.ReflectionOnly) ||
+ (fIsReflectionOnlyType)
+ )
+ {
+ invocationFlags |= INVOCATION_FLAGS.INVOCATION_FLAGS_NO_INVOKE;
+ }
+
+ // If the invocationFlags are still 0, then
+ // this should be an usable field, determine the other flags
+ if (invocationFlags == 0)
+ {
+ if ((m_fieldAttributes & FieldAttributes.InitOnly) != (FieldAttributes)0)
+ invocationFlags |= INVOCATION_FLAGS.INVOCATION_FLAGS_SPECIAL_FIELD;
+
+ if ((m_fieldAttributes & FieldAttributes.HasFieldRVA) != (FieldAttributes)0)
+ invocationFlags |= INVOCATION_FLAGS.INVOCATION_FLAGS_SPECIAL_FIELD;
+
+ // A public field is inaccesible to Transparent code if the field is Critical.
+ bool needsTransparencySecurityCheck = IsSecurityCritical && !IsSecuritySafeCritical;
+ bool needsVisibilitySecurityCheck = ((m_fieldAttributes & FieldAttributes.FieldAccessMask) != FieldAttributes.Public) ||
+ (declaringType != null && declaringType.NeedsReflectionSecurityCheck);
+ if (needsTransparencySecurityCheck || needsVisibilitySecurityCheck)
+ invocationFlags |= INVOCATION_FLAGS.INVOCATION_FLAGS_NEED_SECURITY;
+
+ // find out if the field type is one of the following: Primitive, Enum or Pointer
+ Type fieldType = FieldType;
+ if (fieldType.IsPointer || fieldType.IsEnum || fieldType.IsPrimitive)
+ invocationFlags |= INVOCATION_FLAGS.INVOCATION_FLAGS_FIELD_SPECIAL_CAST;
+ }
+
+ // must be last to avoid threading problems
+ m_invocationFlags = invocationFlags | INVOCATION_FLAGS.INVOCATION_FLAGS_INITIALIZED;
+ }
+
+ return m_invocationFlags;
+ }
+ }
+ #endregion
+
+ private RuntimeAssembly GetRuntimeAssembly() { return m_declaringType.GetRuntimeAssembly(); }
+
+ #region Constructor
+ internal RtFieldInfo(
+ RuntimeFieldHandleInternal handle, RuntimeType declaringType, RuntimeTypeCache reflectedTypeCache, BindingFlags bindingFlags)
+ : base(reflectedTypeCache, declaringType, bindingFlags)
+ {
+ m_fieldHandle = handle.Value;
+ m_fieldAttributes = RuntimeFieldHandle.GetAttributes(handle);
+ }
+ #endregion
+
+ #region Private Members
+ RuntimeFieldHandleInternal IRuntimeFieldInfo.Value
+ {
+ get
+ {
+ return new RuntimeFieldHandleInternal(m_fieldHandle);
+ }
+ }
+
+ #endregion
+
+ #region Internal Members
+ internal void CheckConsistency(Object target)
+ {
+ // only test instance fields
+ if ((m_fieldAttributes & FieldAttributes.Static) != FieldAttributes.Static)
+ {
+ if (!m_declaringType.IsInstanceOfType(target))
+ {
+ if (target == null)
+ {
+ throw new TargetException(Environment.GetResourceString("RFLCT.Targ_StatFldReqTarg"));
+ }
+ else
+ {
+ throw new ArgumentException(
+ String.Format(CultureInfo.CurrentUICulture, Environment.GetResourceString("Arg_FieldDeclTarget"),
+ Name, m_declaringType, target.GetType()));
+ }
+ }
+ }
+ }
+
+ internal override bool CacheEquals(object o)
+ {
+ RtFieldInfo m = o as RtFieldInfo;
+
+ if ((object)m == null)
+ return false;
+
+ return m.m_fieldHandle == m_fieldHandle;
+ }
+
+ [DebuggerStepThroughAttribute]
+ [Diagnostics.DebuggerHidden]
+ internal void InternalSetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, CultureInfo culture, ref StackCrawlMark stackMark)
+ {
+ INVOCATION_FLAGS invocationFlags = InvocationFlags;
+ RuntimeType declaringType = DeclaringType as RuntimeType;
+
+ if ((invocationFlags & INVOCATION_FLAGS.INVOCATION_FLAGS_NO_INVOKE) != 0)
+ {
+ if (declaringType != null && declaringType.ContainsGenericParameters)
+ throw new InvalidOperationException(Environment.GetResourceString("Arg_UnboundGenField"));
+
+ if ((declaringType == null && Module.Assembly.ReflectionOnly) || declaringType is ReflectionOnlyType)
+ throw new InvalidOperationException(Environment.GetResourceString("Arg_ReflectionOnlyField"));
+
+ throw new FieldAccessException();
+ }
+
+ CheckConsistency(obj);
+
+ RuntimeType fieldType = (RuntimeType)FieldType;
+ value = fieldType.CheckValue(value, binder, culture, invokeAttr);
+
+ #region Security Check
+ if ((invocationFlags & (INVOCATION_FLAGS.INVOCATION_FLAGS_SPECIAL_FIELD | INVOCATION_FLAGS.INVOCATION_FLAGS_NEED_SECURITY)) != 0)
+ PerformVisibilityCheckOnField(m_fieldHandle, obj, m_declaringType, m_fieldAttributes, (uint)m_invocationFlags);
+ #endregion
+
+ bool domainInitialized = false;
+ if (declaringType == null)
+ {
+ RuntimeFieldHandle.SetValue(this, obj, value, fieldType, m_fieldAttributes, null, ref domainInitialized);
+ }
+ else
+ {
+ domainInitialized = declaringType.DomainInitialized;
+ RuntimeFieldHandle.SetValue(this, obj, value, fieldType, m_fieldAttributes, declaringType, ref domainInitialized);
+ declaringType.DomainInitialized = domainInitialized;
+ }
+ }
+
+ // UnsafeSetValue doesn't perform any consistency or visibility check.
+ // It is the caller's responsibility to ensure the operation is safe.
+ // When the caller needs to perform visibility checks they should call
+ // InternalSetValue() instead. When the caller needs to perform
+ // consistency checks they should call CheckConsistency() before
+ // calling this method.
+ [DebuggerStepThroughAttribute]
+ [Diagnostics.DebuggerHidden]
+ internal void UnsafeSetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, CultureInfo culture)
+ {
+ RuntimeType declaringType = DeclaringType as RuntimeType;
+ RuntimeType fieldType = (RuntimeType)FieldType;
+ value = fieldType.CheckValue(value, binder, culture, invokeAttr);
+
+ bool domainInitialized = false;
+ if (declaringType == null)
+ {
+ RuntimeFieldHandle.SetValue(this, obj, value, fieldType, m_fieldAttributes, null, ref domainInitialized);
+ }
+ else
+ {
+ domainInitialized = declaringType.DomainInitialized;
+ RuntimeFieldHandle.SetValue(this, obj, value, fieldType, m_fieldAttributes, declaringType, ref domainInitialized);
+ declaringType.DomainInitialized = domainInitialized;
+ }
+ }
+
+ [DebuggerStepThroughAttribute]
+ [Diagnostics.DebuggerHidden]
+ internal Object InternalGetValue(Object obj, ref StackCrawlMark stackMark)
+ {
+ INVOCATION_FLAGS invocationFlags = InvocationFlags;
+ RuntimeType declaringType = DeclaringType as RuntimeType;
+
+ if ((invocationFlags & INVOCATION_FLAGS.INVOCATION_FLAGS_NO_INVOKE) != 0)
+ {
+ if (declaringType != null && DeclaringType.ContainsGenericParameters)
+ throw new InvalidOperationException(Environment.GetResourceString("Arg_UnboundGenField"));
+
+ if ((declaringType == null && Module.Assembly.ReflectionOnly) || declaringType is ReflectionOnlyType)
+ throw new InvalidOperationException(Environment.GetResourceString("Arg_ReflectionOnlyField"));
+
+ throw new FieldAccessException();
+ }
+
+ CheckConsistency(obj);
+
+ RuntimeType fieldType = (RuntimeType)FieldType;
+ if ((invocationFlags & INVOCATION_FLAGS.INVOCATION_FLAGS_NEED_SECURITY) != 0)
+ PerformVisibilityCheckOnField(m_fieldHandle, obj, m_declaringType, m_fieldAttributes, (uint)(m_invocationFlags & ~INVOCATION_FLAGS.INVOCATION_FLAGS_SPECIAL_FIELD));
+
+ return UnsafeGetValue(obj);
+ }
+
+ // UnsafeGetValue doesn't perform any consistency or visibility check.
+ // It is the caller's responsibility to ensure the operation is safe.
+ // When the caller needs to perform visibility checks they should call
+ // InternalGetValue() instead. When the caller needs to perform
+ // consistency checks they should call CheckConsistency() before
+ // calling this method.
+ [DebuggerStepThroughAttribute]
+ [Diagnostics.DebuggerHidden]
+ internal Object UnsafeGetValue(Object obj)
+ {
+ RuntimeType declaringType = DeclaringType as RuntimeType;
+
+ RuntimeType fieldType = (RuntimeType)FieldType;
+
+ bool domainInitialized = false;
+ if (declaringType == null)
+ {
+ return RuntimeFieldHandle.GetValue(this, obj, fieldType, null, ref domainInitialized);
+ }
+ else
+ {
+ domainInitialized = declaringType.DomainInitialized;
+ object retVal = RuntimeFieldHandle.GetValue(this, obj, fieldType, declaringType, ref domainInitialized);
+ declaringType.DomainInitialized = domainInitialized;
+ return retVal;
+ }
+ }
+
+ #endregion
+
+ #region MemberInfo Overrides
+ public override String Name
+ {
+ get
+ {
+ if (m_name == null)
+ m_name = RuntimeFieldHandle.GetName(this);
+
+ return m_name;
+ }
+ }
+
+ internal String FullName
+ {
+ get
+ {
+ return String.Format("{0}.{1}", DeclaringType.FullName, Name);
+ }
+ }
+
+ public override int MetadataToken
+ {
+ get { return RuntimeFieldHandle.GetToken(this); }
+ }
+
+ internal override RuntimeModule GetRuntimeModule()
+ {
+ return RuntimeTypeHandle.GetModule(RuntimeFieldHandle.GetApproxDeclaringType(this));
+ }
+
+ #endregion
+
+ #region FieldInfo Overrides
+ public override Object GetValue(Object obj)
+ {
+ StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
+ return InternalGetValue(obj, ref stackMark);
+ }
+
+ public override object GetRawConstantValue() { throw new InvalidOperationException(); }
+
+ [DebuggerStepThroughAttribute]
+ [Diagnostics.DebuggerHidden]
+ public override Object GetValueDirect(TypedReference obj)
+ {
+ if (obj.IsNull)
+ throw new ArgumentException(Environment.GetResourceString("Arg_TypedReference_Null"));
+ Contract.EndContractBlock();
+
+ unsafe
+ {
+ // Passing TypedReference by reference is easier to make correct in native code
+ return RuntimeFieldHandle.GetValueDirect(this, (RuntimeType)FieldType, &obj, (RuntimeType)DeclaringType);
+ }
+ }
+
+ [DebuggerStepThroughAttribute]
+ [Diagnostics.DebuggerHidden]
+ public override void SetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, CultureInfo culture)
+ {
+ StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
+ InternalSetValue(obj, value, invokeAttr, binder, culture, ref stackMark);
+ }
+
+ [DebuggerStepThroughAttribute]
+ [Diagnostics.DebuggerHidden]
+ public override void SetValueDirect(TypedReference obj, Object value)
+ {
+ if (obj.IsNull)
+ throw new ArgumentException(Environment.GetResourceString("Arg_TypedReference_Null"));
+ Contract.EndContractBlock();
+
+ unsafe
+ {
+ // Passing TypedReference by reference is easier to make correct in native code
+ RuntimeFieldHandle.SetValueDirect(this, (RuntimeType)FieldType, &obj, value, (RuntimeType)DeclaringType);
+ }
+ }
+
+ public override RuntimeFieldHandle FieldHandle
+ {
+ get
+ {
+ Type declaringType = DeclaringType;
+ if ((declaringType == null && Module.Assembly.ReflectionOnly) || declaringType is ReflectionOnlyType)
+ throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_NotAllowedInReflectionOnly"));
+ return new RuntimeFieldHandle(this);
+ }
+ }
+
+ internal IntPtr GetFieldHandle()
+ {
+ return m_fieldHandle;
+ }
+
+ public override FieldAttributes Attributes
+ {
+ get
+ {
+ return m_fieldAttributes;
+ }
+ }
+
+ public override Type FieldType
+ {
+ get
+ {
+ if (m_fieldType == null)
+ m_fieldType = new Signature(this, m_declaringType).FieldType;
+
+ return m_fieldType;
+ }
+ }
+
+ public override Type[] GetRequiredCustomModifiers()
+ {
+ return new Signature(this, m_declaringType).GetCustomModifiers(1, true);
+ }
+
+ public override Type[] GetOptionalCustomModifiers()
+ {
+ return new Signature(this, m_declaringType).GetCustomModifiers(1, false);
+ }
+
+ #endregion
+ }
+}
--- /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.Collections.Generic;
+using CultureInfo = System.Globalization.CultureInfo;
+using System.Security;
+using System.Security.Policy;
+using System.IO;
+using StringBuilder = System.Text.StringBuilder;
+using System.Configuration.Assemblies;
+using StackCrawlMark = System.Threading.StackCrawlMark;
+using System.Runtime.InteropServices;
+using System.Runtime.CompilerServices;
+using System.Runtime.Serialization;
+using System.Threading;
+using System.Diagnostics.Contracts;
+
+namespace System.Reflection
+{
+ [Serializable]
+ internal class RuntimeAssembly : Assembly
+ {
+#if FEATURE_APPX
+ // The highest byte is the flags and the lowest 3 bytes are
+ // the cached ctor token of [DynamicallyInvocableAttribute].
+ private enum ASSEMBLY_FLAGS : uint
+ {
+ ASSEMBLY_FLAGS_UNKNOWN = 0x00000000,
+ ASSEMBLY_FLAGS_INITIALIZED = 0x01000000,
+ ASSEMBLY_FLAGS_FRAMEWORK = 0x02000000,
+ ASSEMBLY_FLAGS_TOKEN_MASK = 0x00FFFFFF,
+ }
+#endif // FEATURE_APPX
+
+ private const uint COR_E_LOADING_REFERENCE_ASSEMBLY = 0x80131058U;
+
+ internal RuntimeAssembly() { throw new NotSupportedException(); }
+
+ #region private data members
+ private event ModuleResolveEventHandler _ModuleResolve;
+ private string m_fullname;
+ private object m_syncRoot; // Used to keep collectible types alive and as the syncroot for reflection.emit
+ private IntPtr m_assembly; // slack for ptr datum on unmanaged side
+
+#if FEATURE_APPX
+ private ASSEMBLY_FLAGS m_flags;
+#endif
+ #endregion
+
+#if FEATURE_APPX
+ private ASSEMBLY_FLAGS Flags
+ {
+ get
+ {
+ if ((m_flags & ASSEMBLY_FLAGS.ASSEMBLY_FLAGS_INITIALIZED) == 0)
+ {
+ ASSEMBLY_FLAGS flags = ASSEMBLY_FLAGS.ASSEMBLY_FLAGS_UNKNOWN
+ | ASSEMBLY_FLAGS.ASSEMBLY_FLAGS_FRAMEWORK;
+
+ m_flags = flags | ASSEMBLY_FLAGS.ASSEMBLY_FLAGS_INITIALIZED;
+ }
+
+ return m_flags;
+ }
+ }
+#endif // FEATURE_APPX
+
+ internal object SyncRoot
+ {
+ get
+ {
+ if (m_syncRoot == null)
+ {
+ Interlocked.CompareExchange<object>(ref m_syncRoot, new object(), null);
+ }
+ return m_syncRoot;
+ }
+ }
+
+ public override event ModuleResolveEventHandler ModuleResolve
+ {
+ add
+ {
+ _ModuleResolve += value;
+ }
+ remove
+ {
+ _ModuleResolve -= value;
+ }
+ }
+
+ private const String s_localFilePrefix = "file:";
+
+ [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
+ [SuppressUnmanagedCodeSecurity]
+ private static extern void GetCodeBase(RuntimeAssembly assembly,
+ bool copiedName,
+ StringHandleOnStack retString);
+
+ internal String GetCodeBase(bool copiedName)
+ {
+ String codeBase = null;
+ GetCodeBase(GetNativeHandle(), copiedName, JitHelpers.GetStringHandleOnStack(ref codeBase));
+ return codeBase;
+ }
+
+ public override String CodeBase
+ {
+ get
+ {
+ String codeBase = GetCodeBase(false);
+ return codeBase;
+ }
+ }
+
+ internal RuntimeAssembly GetNativeHandle()
+ {
+ return this;
+ }
+
+ // If the assembly is copied before it is loaded, the codebase will be set to the
+ // actual file loaded if copiedName is true. If it is false, then the original code base
+ // is returned.
+ public override AssemblyName GetName(bool copiedName)
+ {
+ AssemblyName an = new AssemblyName();
+
+ String codeBase = GetCodeBase(copiedName);
+
+ an.Init(GetSimpleName(),
+ GetPublicKey(),
+ null, // public key token
+ GetVersion(),
+ GetLocale(),
+ GetHashAlgorithm(),
+ AssemblyVersionCompatibility.SameMachine,
+ codeBase,
+ GetFlags() | AssemblyNameFlags.PublicKey,
+ null); // strong name key pair
+
+ PortableExecutableKinds pek;
+ ImageFileMachine ifm;
+
+ Module manifestModule = ManifestModule;
+ if (manifestModule != null)
+ {
+ if (manifestModule.MDStreamVersion > 0x10000)
+ {
+ ManifestModule.GetPEKind(out pek, out ifm);
+ an.SetProcArchIndex(pek, ifm);
+ }
+ }
+ return an;
+ }
+
+ [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
+ [SuppressUnmanagedCodeSecurity]
+ private extern static void GetFullName(RuntimeAssembly assembly, StringHandleOnStack retString);
+
+ public override String FullName
+ {
+ get
+ {
+ // If called by Object.ToString(), return val may be NULL.
+ if (m_fullname == null)
+ {
+ string s = null;
+ GetFullName(GetNativeHandle(), JitHelpers.GetStringHandleOnStack(ref s));
+ Interlocked.CompareExchange<string>(ref m_fullname, s, null);
+ }
+
+ return m_fullname;
+ }
+ }
+
+ [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
+ [SuppressUnmanagedCodeSecurity]
+ private static extern void GetEntryPoint(RuntimeAssembly assembly, ObjectHandleOnStack retMethod);
+
+ public override MethodInfo EntryPoint
+ {
+ get
+ {
+ IRuntimeMethodInfo methodHandle = null;
+ GetEntryPoint(GetNativeHandle(), JitHelpers.GetObjectHandleOnStack(ref methodHandle));
+
+ if (methodHandle == null)
+ return null;
+
+ return (MethodInfo)RuntimeType.GetMethodBase(methodHandle);
+ }
+ }
+
+ [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
+ [SuppressUnmanagedCodeSecurity]
+ private static extern void GetType(RuntimeAssembly assembly,
+ String name,
+ bool throwOnError,
+ bool ignoreCase,
+ ObjectHandleOnStack type,
+ ObjectHandleOnStack keepAlive);
+
+ public override Type GetType(String name, bool throwOnError, bool ignoreCase)
+ {
+ // throw on null strings regardless of the value of "throwOnError"
+ if (name == null)
+ throw new ArgumentNullException(nameof(name));
+
+ RuntimeType type = null;
+ Object keepAlive = null;
+ GetType(GetNativeHandle(), name, throwOnError, ignoreCase, JitHelpers.GetObjectHandleOnStack(ref type), JitHelpers.GetObjectHandleOnStack(ref keepAlive));
+ GC.KeepAlive(keepAlive);
+
+ return type;
+ }
+
+ [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
+ [SuppressUnmanagedCodeSecurity]
+ private extern static void GetExportedTypes(RuntimeAssembly assembly, ObjectHandleOnStack retTypes);
+
+ public override Type[] GetExportedTypes()
+ {
+ Type[] types = null;
+ GetExportedTypes(GetNativeHandle(), JitHelpers.GetObjectHandleOnStack(ref types));
+ return types;
+ }
+
+ public override IEnumerable<TypeInfo> DefinedTypes
+ {
+ get
+ {
+ List<RuntimeType> rtTypes = new List<RuntimeType>();
+
+ RuntimeModule[] modules = GetModulesInternal(true, false);
+
+ for (int i = 0; i < modules.Length; i++)
+ {
+ rtTypes.AddRange(modules[i].GetDefinedTypes());
+ }
+
+ return rtTypes.ToArray();
+ }
+ }
+
+ // Load a resource based on the NameSpace of the type.
+ [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod
+ public override Stream GetManifestResourceStream(Type type, String name)
+ {
+ StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
+ return GetManifestResourceStream(type, name, false, ref stackMark);
+ }
+
+ [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod
+ public override Stream GetManifestResourceStream(String name)
+ {
+ StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
+ return GetManifestResourceStream(name, ref stackMark, false);
+ }
+
+ // ISerializable implementation
+ public override void GetObjectData(SerializationInfo info, StreamingContext context)
+ {
+ if (info == null)
+ throw new ArgumentNullException(nameof(info));
+
+ Contract.EndContractBlock();
+
+ UnitySerializationHolder.GetUnitySerializationInfo(info,
+ UnitySerializationHolder.AssemblyUnity,
+ this.FullName,
+ this);
+ }
+
+ public override Module ManifestModule
+ {
+ get
+ {
+ // We don't need to return the "external" ModuleBuilder because
+ // it is meant to be read-only
+ return RuntimeAssembly.GetManifestModule(GetNativeHandle());
+ }
+ }
+
+ public override Object[] GetCustomAttributes(bool inherit)
+ {
+ return CustomAttribute.GetCustomAttributes(this, typeof(object) as RuntimeType);
+ }
+
+ public override Object[] GetCustomAttributes(Type attributeType, bool inherit)
+ {
+ if (attributeType == null)
+ throw new ArgumentNullException(nameof(attributeType));
+ Contract.EndContractBlock();
+
+ RuntimeType attributeRuntimeType = attributeType.UnderlyingSystemType as RuntimeType;
+
+ if (attributeRuntimeType == null)
+ throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"), nameof(attributeType));
+
+ return CustomAttribute.GetCustomAttributes(this, attributeRuntimeType);
+ }
+
+ public override bool IsDefined(Type attributeType, bool inherit)
+ {
+ if (attributeType == null)
+ throw new ArgumentNullException(nameof(attributeType));
+ Contract.EndContractBlock();
+
+ RuntimeType attributeRuntimeType = attributeType.UnderlyingSystemType as RuntimeType;
+
+ if (attributeRuntimeType == null)
+ throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"), nameof(attributeType));
+
+ return CustomAttribute.IsDefined(this, attributeRuntimeType);
+ }
+
+ public override IList<CustomAttributeData> GetCustomAttributesData()
+ {
+ return CustomAttributeData.GetCustomAttributesInternal(this);
+ }
+
+ [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod
+ internal static RuntimeAssembly InternalLoadFrom(String assemblyFile,
+ Evidence securityEvidence,
+ byte[] hashValue,
+ AssemblyHashAlgorithm hashAlgorithm,
+ bool forIntrospection,
+ ref StackCrawlMark stackMark)
+ {
+ if (assemblyFile == null)
+ throw new ArgumentNullException(nameof(assemblyFile));
+
+ Contract.EndContractBlock();
+
+ AssemblyName an = new AssemblyName();
+ an.CodeBase = assemblyFile;
+ an.SetHashControl(hashValue, hashAlgorithm);
+ // The stack mark is used for MDA filtering
+ return InternalLoadAssemblyName(an, securityEvidence, null, ref stackMark, true /*thrownOnFileNotFound*/, forIntrospection);
+ }
+
+ // Wrapper function to wrap the typical use of InternalLoad.
+ internal static RuntimeAssembly InternalLoad(String assemblyString,
+ Evidence assemblySecurity,
+ ref StackCrawlMark stackMark,
+ bool forIntrospection)
+ {
+ return InternalLoad(assemblyString, assemblySecurity, ref stackMark, IntPtr.Zero, forIntrospection);
+ }
+
+ [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod
+ internal static RuntimeAssembly InternalLoad(String assemblyString,
+ Evidence assemblySecurity,
+ ref StackCrawlMark stackMark,
+ IntPtr pPrivHostBinder,
+ bool forIntrospection)
+ {
+ RuntimeAssembly assembly;
+ AssemblyName an = CreateAssemblyName(assemblyString, forIntrospection, out assembly);
+
+ if (assembly != null)
+ {
+ // The assembly was returned from ResolveAssemblyEvent
+ return assembly;
+ }
+
+ return InternalLoadAssemblyName(an, assemblySecurity, null, ref stackMark,
+ pPrivHostBinder,
+ true /*thrownOnFileNotFound*/, forIntrospection);
+ }
+
+ // Creates AssemblyName. Fills assembly if AssemblyResolve event has been raised.
+ internal static AssemblyName CreateAssemblyName(
+ String assemblyString,
+ bool forIntrospection,
+ out RuntimeAssembly assemblyFromResolveEvent)
+ {
+ if (assemblyString == null)
+ throw new ArgumentNullException(nameof(assemblyString));
+ Contract.EndContractBlock();
+
+ if ((assemblyString.Length == 0) ||
+ (assemblyString[0] == '\0'))
+ throw new ArgumentException(Environment.GetResourceString("Format_StringZeroLength"));
+
+ if (forIntrospection)
+ AppDomain.CheckReflectionOnlyLoadSupported();
+
+ AssemblyName an = new AssemblyName();
+
+ an.Name = assemblyString;
+ an.nInit(out assemblyFromResolveEvent, forIntrospection, true);
+
+ return an;
+ }
+
+ // Wrapper function to wrap the typical use of InternalLoadAssemblyName.
+ internal static RuntimeAssembly InternalLoadAssemblyName(
+ AssemblyName assemblyRef,
+ Evidence assemblySecurity,
+ RuntimeAssembly reqAssembly,
+ ref StackCrawlMark stackMark,
+ bool throwOnFileNotFound,
+ bool forIntrospection,
+ IntPtr ptrLoadContextBinder = default(IntPtr))
+ {
+ return InternalLoadAssemblyName(assemblyRef, assemblySecurity, reqAssembly, ref stackMark, IntPtr.Zero, true /*throwOnError*/, forIntrospection, ptrLoadContextBinder);
+ }
+
+ internal static RuntimeAssembly InternalLoadAssemblyName(
+ AssemblyName assemblyRef,
+ Evidence assemblySecurity,
+ RuntimeAssembly reqAssembly,
+ ref StackCrawlMark stackMark,
+ IntPtr pPrivHostBinder,
+ bool throwOnFileNotFound,
+ bool forIntrospection,
+ IntPtr ptrLoadContextBinder = default(IntPtr))
+ {
+ if (assemblyRef == null)
+ throw new ArgumentNullException(nameof(assemblyRef));
+ Contract.EndContractBlock();
+
+ if (assemblyRef.CodeBase != null)
+ {
+ AppDomain.CheckLoadFromSupported();
+ }
+
+ assemblyRef = (AssemblyName)assemblyRef.Clone();
+ if (!forIntrospection &&
+ (assemblyRef.ProcessorArchitecture != ProcessorArchitecture.None))
+ {
+ // PA does not have a semantics for by-name binds for execution
+ assemblyRef.ProcessorArchitecture = ProcessorArchitecture.None;
+ }
+
+ String codeBase = VerifyCodeBase(assemblyRef.CodeBase);
+
+ return nLoad(assemblyRef, codeBase, assemblySecurity, reqAssembly, ref stackMark,
+ pPrivHostBinder,
+ throwOnFileNotFound, forIntrospection, ptrLoadContextBinder);
+ }
+
+ // These are the framework assemblies that does reflection invocation
+ // on behalf of user code. We allow framework code to invoke non-W8P
+ // framework APIs but don't want user code to gain that privilege
+ // through these assemblies. So we blaklist them.
+ private static string[] s_unsafeFrameworkAssemblyNames = new string[] {
+ "System.Reflection.Context",
+ "Microsoft.VisualBasic"
+ };
+
+#if FEATURE_APPX
+ internal bool IsFrameworkAssembly()
+ {
+ ASSEMBLY_FLAGS flags = Flags;
+ return (flags & ASSEMBLY_FLAGS.ASSEMBLY_FLAGS_FRAMEWORK) != 0;
+ }
+#endif
+
+ [MethodImplAttribute(MethodImplOptions.InternalCall)]
+ private static extern RuntimeAssembly _nLoad(AssemblyName fileName,
+ String codeBase,
+ Evidence assemblySecurity,
+ RuntimeAssembly locationHint,
+ ref StackCrawlMark stackMark,
+ IntPtr pPrivHostBinder,
+ bool throwOnFileNotFound,
+ bool forIntrospection,
+ bool suppressSecurityChecks,
+ IntPtr ptrLoadContextBinder);
+
+ private static RuntimeAssembly nLoad(AssemblyName fileName,
+ String codeBase,
+ Evidence assemblySecurity,
+ RuntimeAssembly locationHint,
+ ref StackCrawlMark stackMark,
+ IntPtr pPrivHostBinder,
+ bool throwOnFileNotFound,
+ bool forIntrospection,
+ IntPtr ptrLoadContextBinder = default(IntPtr))
+ {
+ return _nLoad(fileName, codeBase, assemblySecurity, locationHint, ref stackMark,
+ pPrivHostBinder,
+ throwOnFileNotFound, forIntrospection, true /* suppressSecurityChecks */, ptrLoadContextBinder);
+ }
+
+ [MethodImplAttribute(MethodImplOptions.InternalCall)]
+ private static extern bool IsReflectionOnly(RuntimeAssembly assembly);
+
+ public override bool ReflectionOnly
+ {
+ get
+ {
+ return IsReflectionOnly(GetNativeHandle());
+ }
+ }
+
+ // Returns the module in this assembly with name 'name'
+
+ [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
+ [SuppressUnmanagedCodeSecurity]
+ private static extern void GetModule(RuntimeAssembly assembly, String name, ObjectHandleOnStack retModule);
+
+ public override Module GetModule(String name)
+ {
+ Module retModule = null;
+ GetModule(GetNativeHandle(), name, JitHelpers.GetObjectHandleOnStack(ref retModule));
+ return retModule;
+ }
+
+ // Returns the file in the File table of the manifest that matches the
+ // given name. (Name should not include path.)
+ public override FileStream GetFile(String name)
+ {
+ RuntimeModule m = (RuntimeModule)GetModule(name);
+ if (m == null)
+ return null;
+
+ return new FileStream(m.GetFullyQualifiedName(),
+ FileMode.Open,
+ FileAccess.Read, FileShare.Read, FileStream.DefaultBufferSize, false);
+ }
+
+ public override FileStream[] GetFiles(bool getResourceModules)
+ {
+ Module[] m = GetModules(getResourceModules);
+ FileStream[] fs = new FileStream[m.Length];
+
+ for (int i = 0; i < fs.Length; i++)
+ {
+ fs[i] = new FileStream(((RuntimeModule)m[i]).GetFullyQualifiedName(),
+ FileMode.Open,
+ FileAccess.Read, FileShare.Read, FileStream.DefaultBufferSize, false);
+ }
+
+ return fs;
+ }
+
+ // Returns the names of all the resources
+ [MethodImplAttribute(MethodImplOptions.InternalCall)]
+ private static extern String[] GetManifestResourceNames(RuntimeAssembly assembly);
+
+ // Returns the names of all the resources
+ public override String[] GetManifestResourceNames()
+ {
+ return GetManifestResourceNames(GetNativeHandle());
+ }
+
+ [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
+ [SuppressUnmanagedCodeSecurity]
+ private extern static void GetExecutingAssembly(StackCrawlMarkHandle stackMark, ObjectHandleOnStack retAssembly);
+
+ internal static RuntimeAssembly GetExecutingAssembly(ref StackCrawlMark stackMark)
+ {
+ RuntimeAssembly retAssembly = null;
+ GetExecutingAssembly(JitHelpers.GetStackCrawlMarkHandle(ref stackMark), JitHelpers.GetObjectHandleOnStack(ref retAssembly));
+ return retAssembly;
+ }
+
+ // Returns the names of all the resources
+ [MethodImplAttribute(MethodImplOptions.InternalCall)]
+ private static extern AssemblyName[] GetReferencedAssemblies(RuntimeAssembly assembly);
+
+ public override AssemblyName[] GetReferencedAssemblies()
+ {
+ return GetReferencedAssemblies(GetNativeHandle());
+ }
+
+ [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
+ [SuppressUnmanagedCodeSecurity]
+ private static extern int GetManifestResourceInfo(RuntimeAssembly assembly,
+ String resourceName,
+ ObjectHandleOnStack assemblyRef,
+ StringHandleOnStack retFileName,
+ StackCrawlMarkHandle stackMark);
+
+ [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod
+ public override ManifestResourceInfo GetManifestResourceInfo(String resourceName)
+ {
+ RuntimeAssembly retAssembly = null;
+ String fileName = null;
+ StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
+ int location = GetManifestResourceInfo(GetNativeHandle(), resourceName,
+ JitHelpers.GetObjectHandleOnStack(ref retAssembly),
+ JitHelpers.GetStringHandleOnStack(ref fileName),
+ JitHelpers.GetStackCrawlMarkHandle(ref stackMark));
+
+ if (location == -1)
+ return null;
+
+ return new ManifestResourceInfo(retAssembly, fileName,
+ (ResourceLocation)location);
+ }
+
+ [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
+ [SuppressUnmanagedCodeSecurity]
+ private static extern void GetLocation(RuntimeAssembly assembly, StringHandleOnStack retString);
+
+ public override String Location
+ {
+ get
+ {
+ String location = null;
+
+ GetLocation(GetNativeHandle(), JitHelpers.GetStringHandleOnStack(ref location));
+
+ return location;
+ }
+ }
+
+ [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
+ [SuppressUnmanagedCodeSecurity]
+ private extern static void GetImageRuntimeVersion(RuntimeAssembly assembly, StringHandleOnStack retString);
+
+ public override String ImageRuntimeVersion
+ {
+ get
+ {
+ String s = null;
+ GetImageRuntimeVersion(GetNativeHandle(), JitHelpers.GetStringHandleOnStack(ref s));
+ return s;
+ }
+ }
+
+ public override bool GlobalAssemblyCache
+ {
+ get
+ {
+ return false;
+ }
+ }
+
+ public override Int64 HostContext
+ {
+ get
+ {
+ return 0;
+ }
+ }
+
+ private static String VerifyCodeBase(String codebase)
+ {
+ if (codebase == null)
+ return null;
+
+ int len = codebase.Length;
+ if (len == 0)
+ return null;
+
+
+ int j = codebase.IndexOf(':');
+ // Check to see if the url has a prefix
+ if ((j != -1) &&
+ (j + 2 < len) &&
+ ((codebase[j + 1] == '/') || (codebase[j + 1] == '\\')) &&
+ ((codebase[j + 2] == '/') || (codebase[j + 2] == '\\')))
+ return codebase;
+#if !PLATFORM_UNIX
+ else if ((len > 2) && (codebase[0] == '\\') && (codebase[1] == '\\'))
+ return "file://" + codebase;
+ else
+ return "file:///" + Path.GetFullPath(codebase);
+#else
+ else
+ return "file://" + Path.GetFullPath(codebase);
+#endif // !PLATFORM_UNIX
+ }
+
+ internal Stream GetManifestResourceStream(
+ Type type,
+ String name,
+ bool skipSecurityCheck,
+ ref StackCrawlMark stackMark)
+ {
+ StringBuilder sb = new StringBuilder();
+ if (type == null)
+ {
+ if (name == null)
+ throw new ArgumentNullException(nameof(type));
+ }
+ else
+ {
+ String nameSpace = type.Namespace;
+ if (nameSpace != null)
+ {
+ sb.Append(nameSpace);
+ if (name != null)
+ sb.Append(Type.Delimiter);
+ }
+ }
+
+ if (name != null)
+ sb.Append(name);
+
+ return GetManifestResourceStream(sb.ToString(), ref stackMark, skipSecurityCheck);
+ }
+
+ // GetResource will return a pointer to the resources in memory.
+ [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
+ [SuppressUnmanagedCodeSecurity]
+ private static unsafe extern byte* GetResource(RuntimeAssembly assembly,
+ String resourceName,
+ out ulong length,
+ StackCrawlMarkHandle stackMark,
+ bool skipSecurityCheck);
+
+ internal unsafe Stream GetManifestResourceStream(String name, ref StackCrawlMark stackMark, bool skipSecurityCheck)
+ {
+ ulong length = 0;
+ byte* pbInMemoryResource = GetResource(GetNativeHandle(), name, out length, JitHelpers.GetStackCrawlMarkHandle(ref stackMark), skipSecurityCheck);
+
+ if (pbInMemoryResource != null)
+ {
+ //Console.WriteLine("Creating an unmanaged memory stream of length "+length);
+ if (length > Int64.MaxValue)
+ throw new NotImplementedException(Environment.GetResourceString("NotImplemented_ResourcesLongerThan2^63"));
+
+ return new UnmanagedMemoryStream(pbInMemoryResource, (long)length, (long)length, FileAccess.Read);
+ }
+
+ //Console.WriteLine("GetManifestResourceStream: Blob "+name+" not found...");
+ return null;
+ }
+
+ [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
+ [SuppressUnmanagedCodeSecurity]
+ private static extern void GetVersion(RuntimeAssembly assembly,
+ out int majVer,
+ out int minVer,
+ out int buildNum,
+ out int revNum);
+
+ internal Version GetVersion()
+ {
+ int majorVer, minorVer, build, revision;
+ GetVersion(GetNativeHandle(), out majorVer, out minorVer, out build, out revision);
+ return new Version(majorVer, minorVer, build, revision);
+ }
+
+ [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
+ [SuppressUnmanagedCodeSecurity]
+ private static extern void GetLocale(RuntimeAssembly assembly, StringHandleOnStack retString);
+
+ internal CultureInfo GetLocale()
+ {
+ String locale = null;
+
+ GetLocale(GetNativeHandle(), JitHelpers.GetStringHandleOnStack(ref locale));
+
+ if (locale == null)
+ return CultureInfo.InvariantCulture;
+
+ return new CultureInfo(locale);
+ }
+
+ [MethodImplAttribute(MethodImplOptions.InternalCall)]
+ private static extern bool FCallIsDynamic(RuntimeAssembly assembly);
+
+ public override bool IsDynamic
+ {
+ get
+ {
+ return FCallIsDynamic(GetNativeHandle());
+ }
+ }
+
+ [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
+ [SuppressUnmanagedCodeSecurity]
+ private static extern void GetSimpleName(RuntimeAssembly assembly, StringHandleOnStack retSimpleName);
+
+ internal String GetSimpleName()
+ {
+ string name = null;
+ GetSimpleName(GetNativeHandle(), JitHelpers.GetStringHandleOnStack(ref name));
+ return name;
+ }
+
+ [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
+ [SuppressUnmanagedCodeSecurity]
+ private extern static AssemblyHashAlgorithm GetHashAlgorithm(RuntimeAssembly assembly);
+
+ private AssemblyHashAlgorithm GetHashAlgorithm()
+ {
+ return GetHashAlgorithm(GetNativeHandle());
+ }
+
+ [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
+ [SuppressUnmanagedCodeSecurity]
+ private extern static AssemblyNameFlags GetFlags(RuntimeAssembly assembly);
+
+ private AssemblyNameFlags GetFlags()
+ {
+ return GetFlags(GetNativeHandle());
+ }
+
+ [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
+ [SuppressUnmanagedCodeSecurity]
+ private static extern void GetPublicKey(RuntimeAssembly assembly, ObjectHandleOnStack retPublicKey);
+
+ internal byte[] GetPublicKey()
+ {
+ byte[] publicKey = null;
+ GetPublicKey(GetNativeHandle(), JitHelpers.GetObjectHandleOnStack(ref publicKey));
+ return publicKey;
+ }
+
+ [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
+ [SuppressUnmanagedCodeSecurity]
+ [return: MarshalAs(UnmanagedType.Bool)]
+ private extern static bool IsAllSecurityTransparent(RuntimeAssembly assembly);
+
+ // Is everything introduced by this assembly transparent
+ internal bool IsAllSecurityTransparent()
+ {
+ return IsAllSecurityTransparent(GetNativeHandle());
+ }
+
+ // This method is called by the VM.
+ private RuntimeModule OnModuleResolveEvent(String moduleName)
+ {
+ ModuleResolveEventHandler moduleResolve = _ModuleResolve;
+ if (moduleResolve == null)
+ return null;
+
+ Delegate[] ds = moduleResolve.GetInvocationList();
+ int len = ds.Length;
+ for (int i = 0; i < len; i++)
+ {
+ RuntimeModule ret = (RuntimeModule)((ModuleResolveEventHandler)ds[i])(this, new ResolveEventArgs(moduleName, this));
+ if (ret != null)
+ return ret;
+ }
+
+ return null;
+ }
+
+ [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod
+ public override Assembly GetSatelliteAssembly(CultureInfo culture)
+ {
+ StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
+ return InternalGetSatelliteAssembly(culture, null, ref stackMark);
+ }
+
+ // Useful for binding to a very specific version of a satellite assembly
+ [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod
+ public override Assembly GetSatelliteAssembly(CultureInfo culture, Version version)
+ {
+ StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
+ return InternalGetSatelliteAssembly(culture, version, ref stackMark);
+ }
+
+ [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod
+ internal Assembly InternalGetSatelliteAssembly(CultureInfo culture,
+ Version version,
+ ref StackCrawlMark stackMark)
+ {
+ if (culture == null)
+ throw new ArgumentNullException(nameof(culture));
+ Contract.EndContractBlock();
+
+
+ String name = GetSimpleName() + ".resources";
+ return InternalGetSatelliteAssembly(name, culture, version, true, ref stackMark);
+ }
+
+ [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod
+ internal RuntimeAssembly InternalGetSatelliteAssembly(String name,
+ CultureInfo culture,
+ Version version,
+ bool throwOnFileNotFound,
+ ref StackCrawlMark stackMark)
+ {
+ AssemblyName an = new AssemblyName();
+
+ an.SetPublicKey(GetPublicKey());
+ an.Flags = GetFlags() | AssemblyNameFlags.PublicKey;
+
+ if (version == null)
+ an.Version = GetVersion();
+ else
+ an.Version = version;
+
+ an.CultureInfo = culture;
+ an.Name = name;
+
+ RuntimeAssembly retAssembly = nLoad(an, null, null, this, ref stackMark,
+ IntPtr.Zero,
+ throwOnFileNotFound, false);
+
+ if (retAssembly == this || (retAssembly == null && throwOnFileNotFound))
+ {
+ throw new FileNotFoundException(String.Format(culture, Environment.GetResourceString("IO.FileNotFound_FileName"), an.Name));
+ }
+
+ return retAssembly;
+ }
+
+ [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
+ [SuppressUnmanagedCodeSecurity]
+ private extern static void GetModules(RuntimeAssembly assembly,
+ bool loadIfNotFound,
+ bool getResourceModules,
+ ObjectHandleOnStack retModuleHandles);
+
+ private RuntimeModule[] GetModulesInternal(bool loadIfNotFound,
+ bool getResourceModules)
+ {
+ RuntimeModule[] modules = null;
+ GetModules(GetNativeHandle(), loadIfNotFound, getResourceModules, JitHelpers.GetObjectHandleOnStack(ref modules));
+ return modules;
+ }
+
+ public override Module[] GetModules(bool getResourceModules)
+ {
+ return GetModulesInternal(true, getResourceModules);
+ }
+
+ public override Module[] GetLoadedModules(bool getResourceModules)
+ {
+ return GetModulesInternal(false, getResourceModules);
+ }
+
+ [MethodImplAttribute(MethodImplOptions.InternalCall)]
+ internal static extern RuntimeModule GetManifestModule(RuntimeAssembly assembly);
+
+ [MethodImplAttribute(MethodImplOptions.InternalCall)]
+ internal static extern int GetToken(RuntimeAssembly assembly);
+ }
+}
--- /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.Collections.Generic;
+using System.Diagnostics;
+using System.Diagnostics.Contracts;
+using System.Globalization;
+using System.Runtime.Serialization;
+using RuntimeTypeCache = System.RuntimeType.RuntimeTypeCache;
+
+namespace System.Reflection
+{
+ [Serializable]
+ internal sealed class RuntimeConstructorInfo : ConstructorInfo, ISerializable, IRuntimeMethodInfo
+ {
+ #region Private Data Members
+ private volatile RuntimeType m_declaringType;
+ private RuntimeTypeCache m_reflectedTypeCache;
+ private string m_toString;
+ private ParameterInfo[] m_parameters = null; // Created lazily when GetParameters() is called.
+#pragma warning disable 169
+ private object _empty1; // These empties are used to ensure that RuntimeConstructorInfo and RuntimeMethodInfo are have a layout which is sufficiently similar
+ private object _empty2;
+ private object _empty3;
+#pragma warning restore 169
+ private IntPtr m_handle;
+ private MethodAttributes m_methodAttributes;
+ private BindingFlags m_bindingFlags;
+ private volatile Signature m_signature;
+ private INVOCATION_FLAGS m_invocationFlags;
+
+ internal INVOCATION_FLAGS InvocationFlags
+ {
+ get
+ {
+ if ((m_invocationFlags & INVOCATION_FLAGS.INVOCATION_FLAGS_INITIALIZED) == 0)
+ {
+ INVOCATION_FLAGS invocationFlags = INVOCATION_FLAGS.INVOCATION_FLAGS_IS_CTOR; // this is a given
+
+ Type declaringType = DeclaringType;
+
+ //
+ // first take care of all the NO_INVOKE cases.
+ if (declaringType == typeof(void) ||
+ (declaringType != null && declaringType.ContainsGenericParameters) ||
+ ((CallingConvention & CallingConventions.VarArgs) == CallingConventions.VarArgs) ||
+ ((Attributes & MethodAttributes.RequireSecObject) == MethodAttributes.RequireSecObject))
+ {
+ // We don't need other flags if this method cannot be invoked
+ invocationFlags |= INVOCATION_FLAGS.INVOCATION_FLAGS_NO_INVOKE;
+ }
+ else if (IsStatic || declaringType != null && declaringType.IsAbstract)
+ {
+ invocationFlags |= INVOCATION_FLAGS.INVOCATION_FLAGS_NO_CTOR_INVOKE;
+ }
+ else
+ {
+ // this should be an invocable method, determine the other flags that participate in invocation
+ invocationFlags |= RuntimeMethodHandle.GetSecurityFlags(this);
+
+ if ((invocationFlags & INVOCATION_FLAGS.INVOCATION_FLAGS_NEED_SECURITY) == 0 &&
+ ((Attributes & MethodAttributes.MemberAccessMask) != MethodAttributes.Public ||
+ (declaringType != null && declaringType.NeedsReflectionSecurityCheck)))
+ {
+ // If method is non-public, or declaring type is not visible
+ invocationFlags |= INVOCATION_FLAGS.INVOCATION_FLAGS_NEED_SECURITY;
+ }
+
+ // Check for attempt to create a delegate class, we demand unmanaged
+ // code permission for this since it's hard to validate the target address.
+ if (typeof(Delegate).IsAssignableFrom(DeclaringType))
+ invocationFlags |= INVOCATION_FLAGS.INVOCATION_FLAGS_IS_DELEGATE_CTOR;
+ }
+
+ m_invocationFlags = invocationFlags | INVOCATION_FLAGS.INVOCATION_FLAGS_INITIALIZED;
+ }
+
+ return m_invocationFlags;
+ }
+ }
+ #endregion
+
+ #region Constructor
+ internal RuntimeConstructorInfo(
+ RuntimeMethodHandleInternal handle, RuntimeType declaringType, RuntimeTypeCache reflectedTypeCache,
+ MethodAttributes methodAttributes, BindingFlags bindingFlags)
+ {
+ Contract.Ensures(methodAttributes == RuntimeMethodHandle.GetAttributes(handle));
+
+ m_bindingFlags = bindingFlags;
+ m_reflectedTypeCache = reflectedTypeCache;
+ m_declaringType = declaringType;
+ m_handle = handle.Value;
+ m_methodAttributes = methodAttributes;
+ }
+ #endregion
+
+ #region NonPublic Methods
+ RuntimeMethodHandleInternal IRuntimeMethodInfo.Value
+ {
+ get
+ {
+ return new RuntimeMethodHandleInternal(m_handle);
+ }
+ }
+
+ internal override bool CacheEquals(object o)
+ {
+ RuntimeConstructorInfo m = o as RuntimeConstructorInfo;
+
+ if ((object)m == null)
+ return false;
+
+ return m.m_handle == m_handle;
+ }
+
+ private Signature Signature
+ {
+ get
+ {
+ if (m_signature == null)
+ m_signature = new Signature(this, m_declaringType);
+
+ return m_signature;
+ }
+ }
+
+ private RuntimeType ReflectedTypeInternal
+ {
+ get
+ {
+ return m_reflectedTypeCache.GetRuntimeType();
+ }
+ }
+
+ private void CheckConsistency(Object target)
+ {
+ if (target == null && IsStatic)
+ return;
+
+ if (!m_declaringType.IsInstanceOfType(target))
+ {
+ if (target == null)
+ throw new TargetException(Environment.GetResourceString("RFLCT.Targ_StatMethReqTarg"));
+
+ throw new TargetException(Environment.GetResourceString("RFLCT.Targ_ITargMismatch"));
+ }
+ }
+
+ internal BindingFlags BindingFlags { get { return m_bindingFlags; } }
+ #endregion
+
+ #region Object Overrides
+ public override String ToString()
+ {
+ // "Void" really doesn't make sense here. But we'll keep it for compat reasons.
+ if (m_toString == null)
+ m_toString = "Void " + FormatNameAndSig();
+
+ return m_toString;
+ }
+ #endregion
+
+ #region ICustomAttributeProvider
+ public override Object[] GetCustomAttributes(bool inherit)
+ {
+ return CustomAttribute.GetCustomAttributes(this, typeof(object) as RuntimeType);
+ }
+
+ public override Object[] GetCustomAttributes(Type attributeType, bool inherit)
+ {
+ if (attributeType == null)
+ throw new ArgumentNullException(nameof(attributeType));
+ Contract.EndContractBlock();
+
+ RuntimeType attributeRuntimeType = attributeType.UnderlyingSystemType as RuntimeType;
+
+ if (attributeRuntimeType == null)
+ throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"), nameof(attributeType));
+
+ return CustomAttribute.GetCustomAttributes(this, attributeRuntimeType);
+ }
+
+ public override bool IsDefined(Type attributeType, bool inherit)
+ {
+ if (attributeType == null)
+ throw new ArgumentNullException(nameof(attributeType));
+ Contract.EndContractBlock();
+
+ RuntimeType attributeRuntimeType = attributeType.UnderlyingSystemType as RuntimeType;
+
+ if (attributeRuntimeType == null)
+ throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"), nameof(attributeType));
+
+ return CustomAttribute.IsDefined(this, attributeRuntimeType);
+ }
+
+ public override IList<CustomAttributeData> GetCustomAttributesData()
+ {
+ return CustomAttributeData.GetCustomAttributesInternal(this);
+ }
+ #endregion
+
+
+ #region MemberInfo Overrides
+ public override String Name
+ {
+ get { return RuntimeMethodHandle.GetName(this); }
+ }
+ public override MemberTypes MemberType { get { return MemberTypes.Constructor; } }
+
+ public override Type DeclaringType
+ {
+ get
+ {
+ return m_reflectedTypeCache.IsGlobal ? null : m_declaringType;
+ }
+ }
+
+ public override Type ReflectedType
+ {
+ get
+ {
+ return m_reflectedTypeCache.IsGlobal ? null : ReflectedTypeInternal;
+ }
+ }
+
+ public override int MetadataToken
+ {
+ get { return RuntimeMethodHandle.GetMethodDef(this); }
+ }
+ public override Module Module
+ {
+ get { return GetRuntimeModule(); }
+ }
+
+ internal RuntimeType GetRuntimeType() { return m_declaringType; }
+ internal RuntimeModule GetRuntimeModule() { return RuntimeTypeHandle.GetModule(m_declaringType); }
+ internal RuntimeAssembly GetRuntimeAssembly() { return GetRuntimeModule().GetRuntimeAssembly(); }
+ #endregion
+
+ #region MethodBase Overrides
+
+ // This seems to always returns System.Void.
+ internal override Type GetReturnType() { return Signature.ReturnType; }
+
+ internal override ParameterInfo[] GetParametersNoCopy()
+ {
+ if (m_parameters == null)
+ m_parameters = RuntimeParameterInfo.GetParameters(this, this, Signature);
+
+ return m_parameters;
+ }
+
+ [Pure]
+ public override ParameterInfo[] GetParameters()
+ {
+ ParameterInfo[] parameters = GetParametersNoCopy();
+
+ if (parameters.Length == 0)
+ return parameters;
+
+ ParameterInfo[] ret = new ParameterInfo[parameters.Length];
+ Array.Copy(parameters, ret, parameters.Length);
+ return ret;
+ }
+
+ public override MethodImplAttributes GetMethodImplementationFlags()
+ {
+ return RuntimeMethodHandle.GetImplAttributes(this);
+ }
+
+ public override RuntimeMethodHandle MethodHandle
+ {
+ get
+ {
+ Type declaringType = DeclaringType;
+ if ((declaringType == null && Module.Assembly.ReflectionOnly) || declaringType is ReflectionOnlyType)
+ throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_NotAllowedInReflectionOnly"));
+ return new RuntimeMethodHandle(this);
+ }
+ }
+
+ public override MethodAttributes Attributes
+ {
+ get
+ {
+ return m_methodAttributes;
+ }
+ }
+
+ public override CallingConventions CallingConvention
+ {
+ get
+ {
+ return Signature.CallingConvention;
+ }
+ }
+
+ internal static void CheckCanCreateInstance(Type declaringType, bool isVarArg)
+ {
+ if (declaringType == null)
+ throw new ArgumentNullException(nameof(declaringType));
+ Contract.EndContractBlock();
+
+ // ctor is ReflectOnly
+ if (declaringType is ReflectionOnlyType)
+ throw new InvalidOperationException(Environment.GetResourceString("Arg_ReflectionOnlyInvoke"));
+
+ // ctor is declared on interface class
+ else if (declaringType.IsInterface)
+ throw new MemberAccessException(
+ String.Format(CultureInfo.CurrentUICulture, Environment.GetResourceString("Acc_CreateInterfaceEx"), declaringType));
+
+ // ctor is on an abstract class
+ else if (declaringType.IsAbstract)
+ throw new MemberAccessException(
+ String.Format(CultureInfo.CurrentUICulture, Environment.GetResourceString("Acc_CreateAbstEx"), declaringType));
+
+ // ctor is on a class that contains stack pointers
+ else if (declaringType.GetRootElementType() == typeof(ArgIterator))
+ throw new NotSupportedException();
+
+ // ctor is vararg
+ else if (isVarArg)
+ throw new NotSupportedException();
+
+ // ctor is generic or on a generic class
+ else if (declaringType.ContainsGenericParameters)
+ {
+ throw new MemberAccessException(
+ String.Format(CultureInfo.CurrentUICulture, Environment.GetResourceString("Acc_CreateGenericEx"), declaringType));
+ }
+
+ // ctor is declared on System.Void
+ else if (declaringType == typeof(void))
+ throw new MemberAccessException(Environment.GetResourceString("Access_Void"));
+ }
+
+ internal void ThrowNoInvokeException()
+ {
+ CheckCanCreateInstance(DeclaringType, (CallingConvention & CallingConventions.VarArgs) == CallingConventions.VarArgs);
+
+ // ctor is .cctor
+ if ((Attributes & MethodAttributes.Static) == MethodAttributes.Static)
+ throw new MemberAccessException(Environment.GetResourceString("Acc_NotClassInit"));
+
+ throw new TargetException();
+ }
+
+ [DebuggerStepThroughAttribute]
+ [Diagnostics.DebuggerHidden]
+ [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod
+ public override Object Invoke(
+ Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
+ {
+ INVOCATION_FLAGS invocationFlags = InvocationFlags;
+
+ if ((invocationFlags & INVOCATION_FLAGS.INVOCATION_FLAGS_NO_INVOKE) != 0)
+ ThrowNoInvokeException();
+
+ // check basic method consistency. This call will throw if there are problems in the target/method relationship
+ CheckConsistency(obj);
+
+ if (obj != null)
+ {
+ // For unverifiable code, we require the caller to be critical.
+ // Adding the INVOCATION_FLAGS_NEED_SECURITY flag makes that check happen
+ invocationFlags |= INVOCATION_FLAGS.INVOCATION_FLAGS_NEED_SECURITY;
+ }
+
+ Signature sig = Signature;
+
+ // get the signature
+ int formalCount = sig.Arguments.Length;
+ int actualCount = (parameters != null) ? parameters.Length : 0;
+ if (formalCount != actualCount)
+ throw new TargetParameterCountException(Environment.GetResourceString("Arg_ParmCnt"));
+
+ // if we are here we passed all the previous checks. Time to look at the arguments
+ if (actualCount > 0)
+ {
+ Object[] arguments = CheckArguments(parameters, binder, invokeAttr, culture, sig);
+ Object retValue = RuntimeMethodHandle.InvokeMethod(obj, arguments, sig, false);
+ // copy out. This should be made only if ByRef are present.
+ for (int index = 0; index < arguments.Length; index++)
+ parameters[index] = arguments[index];
+ return retValue;
+ }
+ return RuntimeMethodHandle.InvokeMethod(obj, null, sig, false);
+ }
+
+ public override MethodBody GetMethodBody()
+ {
+ MethodBody mb = RuntimeMethodHandle.GetMethodBody(this, ReflectedTypeInternal);
+ if (mb != null)
+ mb.m_methodBase = this;
+ return mb;
+ }
+
+ public override bool IsSecurityCritical
+ {
+ get { return true; }
+ }
+
+ public override bool IsSecuritySafeCritical
+ {
+ get { return false; }
+ }
+
+ public override bool IsSecurityTransparent
+ {
+ get { return false; }
+ }
+
+ public override bool ContainsGenericParameters
+ {
+ get
+ {
+ return (DeclaringType != null && DeclaringType.ContainsGenericParameters);
+ }
+ }
+ #endregion
+
+ #region ConstructorInfo Overrides
+ [DebuggerStepThroughAttribute]
+ [Diagnostics.DebuggerHidden]
+ [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod
+ public override Object Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
+ {
+ INVOCATION_FLAGS invocationFlags = InvocationFlags;
+
+ // get the declaring TypeHandle early for consistent exceptions in IntrospectionOnly context
+ RuntimeTypeHandle declaringTypeHandle = m_declaringType.TypeHandle;
+
+ if ((invocationFlags & (INVOCATION_FLAGS.INVOCATION_FLAGS_NO_INVOKE | INVOCATION_FLAGS.INVOCATION_FLAGS_CONTAINS_STACK_POINTERS | INVOCATION_FLAGS.INVOCATION_FLAGS_NO_CTOR_INVOKE)) != 0)
+ ThrowNoInvokeException();
+
+ // get the signature
+ Signature sig = Signature;
+
+ int formalCount = sig.Arguments.Length;
+ int actualCount = (parameters != null) ? parameters.Length : 0;
+ if (formalCount != actualCount)
+ throw new TargetParameterCountException(Environment.GetResourceString("Arg_ParmCnt"));
+
+ // We don't need to explicitly invoke the class constructor here,
+ // JIT/NGen will insert the call to .cctor in the instance ctor.
+
+ // if we are here we passed all the previous checks. Time to look at the arguments
+ if (actualCount > 0)
+ {
+ Object[] arguments = CheckArguments(parameters, binder, invokeAttr, culture, sig);
+ Object retValue = RuntimeMethodHandle.InvokeMethod(null, arguments, sig, true);
+ // copy out. This should be made only if ByRef are present.
+ for (int index = 0; index < arguments.Length; index++)
+ parameters[index] = arguments[index];
+ return retValue;
+ }
+ return RuntimeMethodHandle.InvokeMethod(null, null, sig, true);
+ }
+ #endregion
+
+ #region ISerializable Implementation
+ public void GetObjectData(SerializationInfo info, StreamingContext context)
+ {
+ if (info == null)
+ throw new ArgumentNullException(nameof(info));
+ Contract.EndContractBlock();
+ MemberInfoSerializationHolder.GetSerializationInfo(
+ info,
+ Name,
+ ReflectedTypeInternal,
+ ToString(),
+ SerializationToString(),
+ MemberTypes.Constructor,
+ null);
+ }
+
+ internal string SerializationToString()
+ {
+ // We don't need the return type for constructors.
+ return FormatNameAndSig(true);
+ }
+ #endregion
+ }
+}
--- /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.Collections.Generic;
+using System.Diagnostics.Contracts;
+using System.Runtime.Serialization;
+using RuntimeTypeCache = System.RuntimeType.RuntimeTypeCache;
+
+namespace System.Reflection
+{
+ [Serializable]
+ internal unsafe sealed class RuntimeEventInfo : EventInfo, ISerializable
+ {
+ #region Private Data Members
+ private int m_token;
+ private EventAttributes m_flags;
+ private string m_name;
+ private void* m_utf8name;
+ private RuntimeTypeCache m_reflectedTypeCache;
+ private RuntimeMethodInfo m_addMethod;
+ private RuntimeMethodInfo m_removeMethod;
+ private RuntimeMethodInfo m_raiseMethod;
+ private MethodInfo[] m_otherMethod;
+ private RuntimeType m_declaringType;
+ private BindingFlags m_bindingFlags;
+ #endregion
+
+ #region Constructor
+ internal RuntimeEventInfo()
+ {
+ // Used for dummy head node during population
+ }
+ internal RuntimeEventInfo(int tkEvent, RuntimeType declaredType, RuntimeTypeCache reflectedTypeCache, out bool isPrivate)
+ {
+ Contract.Requires(declaredType != null);
+ Contract.Requires(reflectedTypeCache != null);
+ Debug.Assert(!reflectedTypeCache.IsGlobal);
+
+ MetadataImport scope = declaredType.GetRuntimeModule().MetadataImport;
+
+ m_token = tkEvent;
+ m_reflectedTypeCache = reflectedTypeCache;
+ m_declaringType = declaredType;
+
+
+ RuntimeType reflectedType = reflectedTypeCache.GetRuntimeType();
+
+ scope.GetEventProps(tkEvent, out m_utf8name, out m_flags);
+
+ RuntimeMethodInfo dummy;
+ Associates.AssignAssociates(scope, tkEvent, declaredType, reflectedType,
+ out m_addMethod, out m_removeMethod, out m_raiseMethod,
+ out dummy, out dummy, out m_otherMethod, out isPrivate, out m_bindingFlags);
+ }
+ #endregion
+
+ #region Internal Members
+ internal override bool CacheEquals(object o)
+ {
+ RuntimeEventInfo m = o as RuntimeEventInfo;
+
+ if ((object)m == null)
+ return false;
+
+ return m.m_token == m_token &&
+ RuntimeTypeHandle.GetModule(m_declaringType).Equals(
+ RuntimeTypeHandle.GetModule(m.m_declaringType));
+ }
+
+ internal BindingFlags BindingFlags { get { return m_bindingFlags; } }
+ #endregion
+
+ #region Object Overrides
+ public override String ToString()
+ {
+ if (m_addMethod == null || m_addMethod.GetParametersNoCopy().Length == 0)
+ throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_NoPublicAddMethod"));
+
+ return m_addMethod.GetParametersNoCopy()[0].ParameterType.FormatTypeName() + " " + Name;
+ }
+ #endregion
+
+ #region ICustomAttributeProvider
+ public override Object[] GetCustomAttributes(bool inherit)
+ {
+ return CustomAttribute.GetCustomAttributes(this, typeof(object) as RuntimeType);
+ }
+
+ public override Object[] GetCustomAttributes(Type attributeType, bool inherit)
+ {
+ if (attributeType == null)
+ throw new ArgumentNullException(nameof(attributeType));
+ Contract.EndContractBlock();
+
+ RuntimeType attributeRuntimeType = attributeType.UnderlyingSystemType as RuntimeType;
+
+ if (attributeRuntimeType == null)
+ throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"), nameof(attributeType));
+
+ return CustomAttribute.GetCustomAttributes(this, attributeRuntimeType);
+ }
+
+ public override bool IsDefined(Type attributeType, bool inherit)
+ {
+ if (attributeType == null)
+ throw new ArgumentNullException(nameof(attributeType));
+ Contract.EndContractBlock();
+
+ RuntimeType attributeRuntimeType = attributeType.UnderlyingSystemType as RuntimeType;
+
+ if (attributeRuntimeType == null)
+ throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"), nameof(attributeType));
+
+ return CustomAttribute.IsDefined(this, attributeRuntimeType);
+ }
+
+ public override IList<CustomAttributeData> GetCustomAttributesData()
+ {
+ return CustomAttributeData.GetCustomAttributesInternal(this);
+ }
+ #endregion
+
+ #region MemberInfo Overrides
+ public override MemberTypes MemberType { get { return MemberTypes.Event; } }
+ public override String Name
+ {
+ get
+ {
+ if (m_name == null)
+ m_name = new Utf8String(m_utf8name).ToString();
+
+ return m_name;
+ }
+ }
+ public override Type DeclaringType { get { return m_declaringType; } }
+ public override Type ReflectedType
+ {
+ get
+ {
+ return ReflectedTypeInternal;
+ }
+ }
+
+ private RuntimeType ReflectedTypeInternal
+ {
+ get
+ {
+ return m_reflectedTypeCache.GetRuntimeType();
+ }
+ }
+
+ public override int MetadataToken { get { return m_token; } }
+ public override Module Module { get { return GetRuntimeModule(); } }
+ internal RuntimeModule GetRuntimeModule() { return m_declaringType.GetRuntimeModule(); }
+ #endregion
+
+ #region ISerializable
+ public void GetObjectData(SerializationInfo info, StreamingContext context)
+ {
+ if (info == null)
+ throw new ArgumentNullException(nameof(info));
+ Contract.EndContractBlock();
+
+ MemberInfoSerializationHolder.GetSerializationInfo(
+ info,
+ Name,
+ ReflectedTypeInternal,
+ null,
+ MemberTypes.Event);
+ }
+ #endregion
+
+ #region EventInfo Overrides
+ public override MethodInfo[] GetOtherMethods(bool nonPublic)
+ {
+ List<MethodInfo> ret = new List<MethodInfo>();
+
+ if ((object)m_otherMethod == null)
+ return new MethodInfo[0];
+
+ for (int i = 0; i < m_otherMethod.Length; i++)
+ {
+ if (Associates.IncludeAccessor((MethodInfo)m_otherMethod[i], nonPublic))
+ ret.Add(m_otherMethod[i]);
+ }
+
+ return ret.ToArray();
+ }
+
+ public override MethodInfo GetAddMethod(bool nonPublic)
+ {
+ if (!Associates.IncludeAccessor(m_addMethod, nonPublic))
+ return null;
+
+ return m_addMethod;
+ }
+
+ public override MethodInfo GetRemoveMethod(bool nonPublic)
+ {
+ if (!Associates.IncludeAccessor(m_removeMethod, nonPublic))
+ return null;
+
+ return m_removeMethod;
+ }
+
+ public override MethodInfo GetRaiseMethod(bool nonPublic)
+ {
+ if (!Associates.IncludeAccessor(m_raiseMethod, nonPublic))
+ return null;
+
+ return m_raiseMethod;
+ }
+
+ public override EventAttributes Attributes
+ {
+ get
+ {
+ return m_flags;
+ }
+ }
+ #endregion
+ }
+}
--- /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.Collections.Generic;
+using System.Diagnostics.Contracts;
+using System.Runtime.Serialization;
+using RuntimeTypeCache = System.RuntimeType.RuntimeTypeCache;
+
+namespace System.Reflection
+{
+ [Serializable]
+ internal abstract class RuntimeFieldInfo : FieldInfo, ISerializable
+ {
+ #region Private Data Members
+ private BindingFlags m_bindingFlags;
+ protected RuntimeTypeCache m_reflectedTypeCache;
+ protected RuntimeType m_declaringType;
+ #endregion
+
+ #region Constructor
+ protected RuntimeFieldInfo()
+ {
+ // Used for dummy head node during population
+ }
+ protected RuntimeFieldInfo(RuntimeTypeCache reflectedTypeCache, RuntimeType declaringType, BindingFlags bindingFlags)
+ {
+ m_bindingFlags = bindingFlags;
+ m_declaringType = declaringType;
+ m_reflectedTypeCache = reflectedTypeCache;
+ }
+ #endregion
+
+ #region NonPublic Members
+ internal BindingFlags BindingFlags { get { return m_bindingFlags; } }
+ private RuntimeType ReflectedTypeInternal
+ {
+ get
+ {
+ return m_reflectedTypeCache.GetRuntimeType();
+ }
+ }
+
+ internal RuntimeType GetDeclaringTypeInternal()
+ {
+ return m_declaringType;
+ }
+
+ internal RuntimeType GetRuntimeType() { return m_declaringType; }
+ internal abstract RuntimeModule GetRuntimeModule();
+ #endregion
+
+ #region MemberInfo Overrides
+ public override MemberTypes MemberType { get { return MemberTypes.Field; } }
+ public override Type ReflectedType
+ {
+ get
+ {
+ return m_reflectedTypeCache.IsGlobal ? null : ReflectedTypeInternal;
+ }
+ }
+
+ public override Type DeclaringType
+ {
+ get
+ {
+ return m_reflectedTypeCache.IsGlobal ? null : m_declaringType;
+ }
+ }
+
+ public override Module Module { get { return GetRuntimeModule(); } }
+ #endregion
+
+ #region Object Overrides
+ public unsafe override String ToString()
+ {
+ return FieldType.FormatTypeName() + " " + Name;
+ }
+ #endregion
+
+ #region ICustomAttributeProvider
+ public override Object[] GetCustomAttributes(bool inherit)
+ {
+ return CustomAttribute.GetCustomAttributes(this, typeof(object) as RuntimeType);
+ }
+
+ public override Object[] GetCustomAttributes(Type attributeType, bool inherit)
+ {
+ if (attributeType == null)
+ throw new ArgumentNullException(nameof(attributeType));
+ Contract.EndContractBlock();
+
+ RuntimeType attributeRuntimeType = attributeType.UnderlyingSystemType as RuntimeType;
+
+ if (attributeRuntimeType == null)
+ throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"), nameof(attributeType));
+
+ return CustomAttribute.GetCustomAttributes(this, attributeRuntimeType);
+ }
+
+ public override bool IsDefined(Type attributeType, bool inherit)
+ {
+ if (attributeType == null)
+ throw new ArgumentNullException(nameof(attributeType));
+ Contract.EndContractBlock();
+
+ RuntimeType attributeRuntimeType = attributeType.UnderlyingSystemType as RuntimeType;
+
+ if (attributeRuntimeType == null)
+ throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"), nameof(attributeType));
+
+ return CustomAttribute.IsDefined(this, attributeRuntimeType);
+ }
+
+ public override IList<CustomAttributeData> GetCustomAttributesData()
+ {
+ return CustomAttributeData.GetCustomAttributesInternal(this);
+ }
+ #endregion
+
+ #region FieldInfo Overrides
+ // All implemented on derived classes
+ #endregion
+
+ #region ISerializable Implementation
+ public void GetObjectData(SerializationInfo info, StreamingContext context)
+ {
+ if (info == null)
+ throw new ArgumentNullException(nameof(info));
+ Contract.EndContractBlock();
+ MemberInfoSerializationHolder.GetSerializationInfo(
+ info,
+ Name,
+ ReflectedTypeInternal,
+ ToString(),
+ MemberTypes.Field);
+ }
+ #endregion
+ }
+}
--- /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.Collections.Generic;
+using System.Diagnostics;
+using System.Diagnostics.Contracts;
+using System.Globalization;
+using System.Runtime.Serialization;
+using System.Security;
+using System.Text;
+using System.Threading;
+using RuntimeTypeCache = System.RuntimeType.RuntimeTypeCache;
+
+namespace System.Reflection
+{
+ [Serializable]
+ internal sealed class RuntimeMethodInfo : MethodInfo, ISerializable, IRuntimeMethodInfo
+ {
+ #region Private Data Members
+ private IntPtr m_handle;
+ private RuntimeTypeCache m_reflectedTypeCache;
+ private string m_name;
+ private string m_toString;
+ private ParameterInfo[] m_parameters;
+ private ParameterInfo m_returnParameter;
+ private BindingFlags m_bindingFlags;
+ private MethodAttributes m_methodAttributes;
+ private Signature m_signature;
+ private RuntimeType m_declaringType;
+ private object m_keepalive;
+ private INVOCATION_FLAGS m_invocationFlags;
+
+ internal INVOCATION_FLAGS InvocationFlags
+ {
+ get
+ {
+ if ((m_invocationFlags & INVOCATION_FLAGS.INVOCATION_FLAGS_INITIALIZED) == 0)
+ {
+ INVOCATION_FLAGS invocationFlags = INVOCATION_FLAGS.INVOCATION_FLAGS_UNKNOWN;
+
+ Type declaringType = DeclaringType;
+
+ //
+ // first take care of all the NO_INVOKE cases.
+ if (ContainsGenericParameters ||
+ ReturnType.IsByRef ||
+ (declaringType != null && declaringType.ContainsGenericParameters) ||
+ ((CallingConvention & CallingConventions.VarArgs) == CallingConventions.VarArgs) ||
+ ((Attributes & MethodAttributes.RequireSecObject) == MethodAttributes.RequireSecObject))
+ {
+ // We don't need other flags if this method cannot be invoked
+ invocationFlags = INVOCATION_FLAGS.INVOCATION_FLAGS_NO_INVOKE;
+ }
+ else
+ {
+ // this should be an invocable method, determine the other flags that participate in invocation
+ invocationFlags = RuntimeMethodHandle.GetSecurityFlags(this);
+
+ if ((invocationFlags & INVOCATION_FLAGS.INVOCATION_FLAGS_NEED_SECURITY) == 0)
+ {
+ if ((Attributes & MethodAttributes.MemberAccessMask) != MethodAttributes.Public ||
+ (declaringType != null && declaringType.NeedsReflectionSecurityCheck))
+ {
+ // If method is non-public, or declaring type is not visible
+ invocationFlags |= INVOCATION_FLAGS.INVOCATION_FLAGS_NEED_SECURITY;
+ }
+ else if (IsGenericMethod)
+ {
+ Type[] genericArguments = GetGenericArguments();
+
+ for (int i = 0; i < genericArguments.Length; i++)
+ {
+ if (genericArguments[i].NeedsReflectionSecurityCheck)
+ {
+ invocationFlags |= INVOCATION_FLAGS.INVOCATION_FLAGS_NEED_SECURITY;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ m_invocationFlags = invocationFlags | INVOCATION_FLAGS.INVOCATION_FLAGS_INITIALIZED;
+ }
+
+ return m_invocationFlags;
+ }
+ }
+ #endregion
+
+ #region Constructor
+ internal RuntimeMethodInfo(
+ RuntimeMethodHandleInternal handle, RuntimeType declaringType,
+ RuntimeTypeCache reflectedTypeCache, MethodAttributes methodAttributes, BindingFlags bindingFlags, object keepalive)
+ {
+ Contract.Ensures(!m_handle.IsNull());
+
+ Debug.Assert(!handle.IsNullHandle());
+ Debug.Assert(methodAttributes == RuntimeMethodHandle.GetAttributes(handle));
+
+ m_bindingFlags = bindingFlags;
+ m_declaringType = declaringType;
+ m_keepalive = keepalive;
+ m_handle = handle.Value;
+ m_reflectedTypeCache = reflectedTypeCache;
+ m_methodAttributes = methodAttributes;
+ }
+ #endregion
+
+ #region Private Methods
+ RuntimeMethodHandleInternal IRuntimeMethodInfo.Value
+ {
+ get
+ {
+ return new RuntimeMethodHandleInternal(m_handle);
+ }
+ }
+
+ private RuntimeType ReflectedTypeInternal
+ {
+ get
+ {
+ return m_reflectedTypeCache.GetRuntimeType();
+ }
+ }
+
+ private ParameterInfo[] FetchNonReturnParameters()
+ {
+ if (m_parameters == null)
+ m_parameters = RuntimeParameterInfo.GetParameters(this, this, Signature);
+
+ return m_parameters;
+ }
+
+ private ParameterInfo FetchReturnParameter()
+ {
+ if (m_returnParameter == null)
+ m_returnParameter = RuntimeParameterInfo.GetReturnParameter(this, this, Signature);
+
+ return m_returnParameter;
+ }
+ #endregion
+
+ #region Internal Members
+ internal override string FormatNameAndSig(bool serialization)
+ {
+ // Serialization uses ToString to resolve MethodInfo overloads.
+ StringBuilder sbName = new StringBuilder(Name);
+
+ // serialization == true: use unambiguous (except for assembly name) type names to distinguish between overloads.
+ // serialization == false: use basic format to maintain backward compatibility of MethodInfo.ToString().
+ TypeNameFormatFlags format = serialization ? TypeNameFormatFlags.FormatSerialization : TypeNameFormatFlags.FormatBasic;
+
+ if (IsGenericMethod)
+ sbName.Append(RuntimeMethodHandle.ConstructInstantiation(this, format));
+
+ sbName.Append("(");
+ sbName.Append(ConstructParameters(GetParameterTypes(), CallingConvention, serialization));
+ sbName.Append(")");
+
+ return sbName.ToString();
+ }
+
+ internal override bool CacheEquals(object o)
+ {
+ RuntimeMethodInfo m = o as RuntimeMethodInfo;
+
+ if ((object)m == null)
+ return false;
+
+ return m.m_handle == m_handle;
+ }
+
+ internal Signature Signature
+ {
+ get
+ {
+ if (m_signature == null)
+ m_signature = new Signature(this, m_declaringType);
+
+ return m_signature;
+ }
+ }
+
+ internal BindingFlags BindingFlags { get { return m_bindingFlags; } }
+
+ internal RuntimeMethodInfo GetParentDefinition()
+ {
+ if (!IsVirtual || m_declaringType.IsInterface)
+ return null;
+
+ RuntimeType parent = (RuntimeType)m_declaringType.BaseType;
+
+ if (parent == null)
+ return null;
+
+ int slot = RuntimeMethodHandle.GetSlot(this);
+
+ if (RuntimeTypeHandle.GetNumVirtuals(parent) <= slot)
+ return null;
+
+ return (RuntimeMethodInfo)RuntimeType.GetMethodBase(parent, RuntimeTypeHandle.GetMethodAt(parent, slot));
+ }
+
+ // Unlike DeclaringType, this will return a valid type even for global methods
+ internal RuntimeType GetDeclaringTypeInternal()
+ {
+ return m_declaringType;
+ }
+
+ #endregion
+
+ #region Object Overrides
+ public override String ToString()
+ {
+ if (m_toString == null)
+ m_toString = ReturnType.FormatTypeName() + " " + FormatNameAndSig();
+
+ return m_toString;
+ }
+
+ public override int GetHashCode()
+ {
+ // See RuntimeMethodInfo.Equals() below.
+ if (IsGenericMethod)
+ return ValueType.GetHashCodeOfPtr(m_handle);
+ else
+ return base.GetHashCode();
+ }
+
+ public override bool Equals(object obj)
+ {
+ if (!IsGenericMethod)
+ return obj == (object)this;
+
+ // We cannot do simple object identity comparisons for generic methods.
+ // Equals will be called in CerHashTable when RuntimeType+RuntimeTypeCache.GetGenericMethodInfo()
+ // retrieve items from and insert items into s_methodInstantiations which is a CerHashtable.
+
+ RuntimeMethodInfo mi = obj as RuntimeMethodInfo;
+
+ if (mi == null || !mi.IsGenericMethod)
+ return false;
+
+ // now we know that both operands are generic methods
+
+ IRuntimeMethodInfo handle1 = RuntimeMethodHandle.StripMethodInstantiation(this);
+ IRuntimeMethodInfo handle2 = RuntimeMethodHandle.StripMethodInstantiation(mi);
+ if (handle1.Value.Value != handle2.Value.Value)
+ return false;
+
+ Type[] lhs = GetGenericArguments();
+ Type[] rhs = mi.GetGenericArguments();
+
+ if (lhs.Length != rhs.Length)
+ return false;
+
+ for (int i = 0; i < lhs.Length; i++)
+ {
+ if (lhs[i] != rhs[i])
+ return false;
+ }
+
+ if (DeclaringType != mi.DeclaringType)
+ return false;
+
+ if (ReflectedType != mi.ReflectedType)
+ return false;
+
+ return true;
+ }
+ #endregion
+
+ #region ICustomAttributeProvider
+ public override Object[] GetCustomAttributes(bool inherit)
+ {
+ return CustomAttribute.GetCustomAttributes(this, typeof(object) as RuntimeType as RuntimeType, inherit);
+ }
+
+ public override Object[] GetCustomAttributes(Type attributeType, bool inherit)
+ {
+ if (attributeType == null)
+ throw new ArgumentNullException(nameof(attributeType));
+ Contract.EndContractBlock();
+
+ RuntimeType attributeRuntimeType = attributeType.UnderlyingSystemType as RuntimeType;
+
+ if (attributeRuntimeType == null)
+ throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"), nameof(attributeType));
+
+ return CustomAttribute.GetCustomAttributes(this, attributeRuntimeType, inherit);
+ }
+
+ public override bool IsDefined(Type attributeType, bool inherit)
+ {
+ if (attributeType == null)
+ throw new ArgumentNullException(nameof(attributeType));
+ Contract.EndContractBlock();
+
+ RuntimeType attributeRuntimeType = attributeType.UnderlyingSystemType as RuntimeType;
+
+ if (attributeRuntimeType == null)
+ throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"), nameof(attributeType));
+
+ return CustomAttribute.IsDefined(this, attributeRuntimeType, inherit);
+ }
+
+ public override IList<CustomAttributeData> GetCustomAttributesData()
+ {
+ return CustomAttributeData.GetCustomAttributesInternal(this);
+ }
+ #endregion
+
+ #region MemberInfo Overrides
+ public override String Name
+ {
+ get
+ {
+ if (m_name == null)
+ m_name = RuntimeMethodHandle.GetName(this);
+
+ return m_name;
+ }
+ }
+
+ public override Type DeclaringType
+ {
+ get
+ {
+ if (m_reflectedTypeCache.IsGlobal)
+ return null;
+
+ return m_declaringType;
+ }
+ }
+
+ public override Type ReflectedType
+ {
+ get
+ {
+ if (m_reflectedTypeCache.IsGlobal)
+ return null;
+
+ return m_reflectedTypeCache.GetRuntimeType();
+ }
+ }
+
+ public override MemberTypes MemberType { get { return MemberTypes.Method; } }
+ public override int MetadataToken
+ {
+ get { return RuntimeMethodHandle.GetMethodDef(this); }
+ }
+ public override Module Module { get { return GetRuntimeModule(); } }
+ internal RuntimeType GetRuntimeType() { return m_declaringType; }
+ internal RuntimeModule GetRuntimeModule() { return m_declaringType.GetRuntimeModule(); }
+ internal RuntimeAssembly GetRuntimeAssembly() { return GetRuntimeModule().GetRuntimeAssembly(); }
+
+ public override bool IsSecurityCritical
+ {
+ get { return true; }
+ }
+ public override bool IsSecuritySafeCritical
+ {
+ get { return false; }
+ }
+ public override bool IsSecurityTransparent
+ {
+ get { return false; }
+ }
+ #endregion
+
+ #region MethodBase Overrides
+ internal override ParameterInfo[] GetParametersNoCopy()
+ {
+ FetchNonReturnParameters();
+
+ return m_parameters;
+ }
+
+ [System.Diagnostics.Contracts.Pure]
+ public override ParameterInfo[] GetParameters()
+ {
+ FetchNonReturnParameters();
+
+ if (m_parameters.Length == 0)
+ return m_parameters;
+
+ ParameterInfo[] ret = new ParameterInfo[m_parameters.Length];
+
+ Array.Copy(m_parameters, ret, m_parameters.Length);
+
+ return ret;
+ }
+
+ public override MethodImplAttributes GetMethodImplementationFlags()
+ {
+ return RuntimeMethodHandle.GetImplAttributes(this);
+ }
+
+ public override RuntimeMethodHandle MethodHandle
+ {
+ get
+ {
+ Type declaringType = DeclaringType;
+ if ((declaringType == null && Module.Assembly.ReflectionOnly) || declaringType is ReflectionOnlyType)
+ throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_NotAllowedInReflectionOnly"));
+ return new RuntimeMethodHandle(this);
+ }
+ }
+
+ public override MethodAttributes Attributes { get { return m_methodAttributes; } }
+
+ public override CallingConventions CallingConvention
+ {
+ get
+ {
+ return Signature.CallingConvention;
+ }
+ }
+
+ public override MethodBody GetMethodBody()
+ {
+ MethodBody mb = RuntimeMethodHandle.GetMethodBody(this, ReflectedTypeInternal);
+ if (mb != null)
+ mb.m_methodBase = this;
+ return mb;
+ }
+ #endregion
+
+ #region Invocation Logic(On MemberBase)
+ private void CheckConsistency(Object target)
+ {
+ // only test instance methods
+ if ((m_methodAttributes & MethodAttributes.Static) != MethodAttributes.Static)
+ {
+ if (!m_declaringType.IsInstanceOfType(target))
+ {
+ if (target == null)
+ throw new TargetException(Environment.GetResourceString("RFLCT.Targ_StatMethReqTarg"));
+ else
+ throw new TargetException(Environment.GetResourceString("RFLCT.Targ_ITargMismatch"));
+ }
+ }
+ }
+
+ private void ThrowNoInvokeException()
+ {
+ // method is ReflectionOnly
+ Type declaringType = DeclaringType;
+ if ((declaringType == null && Module.Assembly.ReflectionOnly) || declaringType is ReflectionOnlyType)
+ {
+ throw new InvalidOperationException(Environment.GetResourceString("Arg_ReflectionOnlyInvoke"));
+ }
+ // method is on a class that contains stack pointers
+ else if ((InvocationFlags & INVOCATION_FLAGS.INVOCATION_FLAGS_CONTAINS_STACK_POINTERS) != 0)
+ {
+ throw new NotSupportedException();
+ }
+ // method is vararg
+ else if ((CallingConvention & CallingConventions.VarArgs) == CallingConventions.VarArgs)
+ {
+ throw new NotSupportedException();
+ }
+ // method is generic or on a generic class
+ else if (DeclaringType.ContainsGenericParameters || ContainsGenericParameters)
+ {
+ throw new InvalidOperationException(Environment.GetResourceString("Arg_UnboundGenParam"));
+ }
+ // method is abstract class
+ else if (IsAbstract)
+ {
+ throw new MemberAccessException();
+ }
+ // ByRef return are not allowed in reflection
+ else if (ReturnType.IsByRef)
+ {
+ throw new NotSupportedException(Environment.GetResourceString("NotSupported_ByRefReturn"));
+ }
+
+ throw new TargetException();
+ }
+
+ [DebuggerStepThroughAttribute]
+ [Diagnostics.DebuggerHidden]
+ [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod
+ public override Object Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
+ {
+ object[] arguments = InvokeArgumentsCheck(obj, invokeAttr, binder, parameters, culture);
+
+ return UnsafeInvokeInternal(obj, parameters, arguments);
+ }
+
+ [DebuggerStepThroughAttribute]
+ [Diagnostics.DebuggerHidden]
+ internal object UnsafeInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
+ {
+ object[] arguments = InvokeArgumentsCheck(obj, invokeAttr, binder, parameters, culture);
+
+ return UnsafeInvokeInternal(obj, parameters, arguments);
+ }
+
+ [DebuggerStepThroughAttribute]
+ [Diagnostics.DebuggerHidden]
+ private object UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
+ {
+ if (arguments == null || arguments.Length == 0)
+ return RuntimeMethodHandle.InvokeMethod(obj, null, Signature, false);
+ else
+ {
+ Object retValue = RuntimeMethodHandle.InvokeMethod(obj, arguments, Signature, false);
+
+ // copy out. This should be made only if ByRef are present.
+ for (int index = 0; index < arguments.Length; index++)
+ parameters[index] = arguments[index];
+
+ return retValue;
+ }
+ }
+
+ [DebuggerStepThroughAttribute]
+ [Diagnostics.DebuggerHidden]
+ private object[] InvokeArgumentsCheck(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
+ {
+ Signature sig = Signature;
+
+ // get the signature
+ int formalCount = sig.Arguments.Length;
+ int actualCount = (parameters != null) ? parameters.Length : 0;
+
+ INVOCATION_FLAGS invocationFlags = InvocationFlags;
+
+ // INVOCATION_FLAGS_CONTAINS_STACK_POINTERS means that the struct (either the declaring type or the return type)
+ // contains pointers that point to the stack. This is either a ByRef or a TypedReference. These structs cannot
+ // be boxed and thus cannot be invoked through reflection which only deals with boxed value type objects.
+ if ((invocationFlags & (INVOCATION_FLAGS.INVOCATION_FLAGS_NO_INVOKE | INVOCATION_FLAGS.INVOCATION_FLAGS_CONTAINS_STACK_POINTERS)) != 0)
+ ThrowNoInvokeException();
+
+ // check basic method consistency. This call will throw if there are problems in the target/method relationship
+ CheckConsistency(obj);
+
+ if (formalCount != actualCount)
+ throw new TargetParameterCountException(Environment.GetResourceString("Arg_ParmCnt"));
+
+ if (actualCount != 0)
+ return CheckArguments(parameters, binder, invokeAttr, culture, sig);
+ else
+ return null;
+ }
+
+ #endregion
+
+ #region MethodInfo Overrides
+ public override Type ReturnType
+ {
+ get { return Signature.ReturnType; }
+ }
+
+ public override ICustomAttributeProvider ReturnTypeCustomAttributes
+ {
+ get { return ReturnParameter; }
+ }
+
+ public override ParameterInfo ReturnParameter
+ {
+ get
+ {
+ Contract.Ensures(m_returnParameter != null);
+
+ FetchReturnParameter();
+ return m_returnParameter as ParameterInfo;
+ }
+ }
+
+ public override MethodInfo GetBaseDefinition()
+ {
+ if (!IsVirtual || IsStatic || m_declaringType == null || m_declaringType.IsInterface)
+ return this;
+
+ int slot = RuntimeMethodHandle.GetSlot(this);
+ RuntimeType declaringType = (RuntimeType)DeclaringType;
+ RuntimeType baseDeclaringType = declaringType;
+ RuntimeMethodHandleInternal baseMethodHandle = new RuntimeMethodHandleInternal();
+
+ do
+ {
+ int cVtblSlots = RuntimeTypeHandle.GetNumVirtuals(declaringType);
+
+ if (cVtblSlots <= slot)
+ break;
+
+ baseMethodHandle = RuntimeTypeHandle.GetMethodAt(declaringType, slot);
+ baseDeclaringType = declaringType;
+
+ declaringType = (RuntimeType)declaringType.BaseType;
+ } while (declaringType != null);
+
+ return (MethodInfo)RuntimeType.GetMethodBase(baseDeclaringType, baseMethodHandle);
+ }
+
+ public override Delegate CreateDelegate(Type delegateType)
+ {
+ StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
+
+ // This API existed in v1/v1.1 and only expected to create closed
+ // instance delegates. Constrain the call to BindToMethodInfo to
+ // open delegates only for backwards compatibility. But we'll allow
+ // relaxed signature checking and open static delegates because
+ // there's no ambiguity there (the caller would have to explicitly
+ // pass us a static method or a method with a non-exact signature
+ // and the only change in behavior from v1.1 there is that we won't
+ // fail the call).
+ return CreateDelegateInternal(
+ delegateType,
+ null,
+ DelegateBindingFlags.OpenDelegateOnly | DelegateBindingFlags.RelaxedSignature,
+ ref stackMark);
+ }
+
+ public override Delegate CreateDelegate(Type delegateType, Object target)
+ {
+ StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
+
+ // This API is new in Whidbey and allows the full range of delegate
+ // flexability (open or closed delegates binding to static or
+ // instance methods with relaxed signature checking). The delegate
+ // can also be closed over null. There's no ambiguity with all these
+ // options since the caller is providing us a specific MethodInfo.
+ return CreateDelegateInternal(
+ delegateType,
+ target,
+ DelegateBindingFlags.RelaxedSignature,
+ ref stackMark);
+ }
+
+ private Delegate CreateDelegateInternal(Type delegateType, Object firstArgument, DelegateBindingFlags bindingFlags, ref StackCrawlMark stackMark)
+ {
+ // Validate the parameters.
+ if (delegateType == null)
+ throw new ArgumentNullException(nameof(delegateType));
+ Contract.EndContractBlock();
+
+ RuntimeType rtType = delegateType as RuntimeType;
+ if (rtType == null)
+ throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeType"), nameof(delegateType));
+
+ if (!rtType.IsDelegate())
+ throw new ArgumentException(Environment.GetResourceString("Arg_MustBeDelegate"), nameof(delegateType));
+
+ Delegate d = Delegate.CreateDelegateInternal(rtType, this, firstArgument, bindingFlags, ref stackMark);
+ if (d == null)
+ {
+ throw new ArgumentException(Environment.GetResourceString("Arg_DlgtTargMeth"));
+ }
+
+ return d;
+ }
+
+ #endregion
+
+ #region Generics
+ public override MethodInfo MakeGenericMethod(params Type[] methodInstantiation)
+ {
+ if (methodInstantiation == null)
+ throw new ArgumentNullException(nameof(methodInstantiation));
+ Contract.EndContractBlock();
+
+ RuntimeType[] methodInstantionRuntimeType = new RuntimeType[methodInstantiation.Length];
+
+ if (!IsGenericMethodDefinition)
+ throw new InvalidOperationException(
+ Environment.GetResourceString("Arg_NotGenericMethodDefinition", this));
+
+ for (int i = 0; i < methodInstantiation.Length; i++)
+ {
+ Type methodInstantiationElem = methodInstantiation[i];
+
+ if (methodInstantiationElem == null)
+ throw new ArgumentNullException();
+
+ RuntimeType rtMethodInstantiationElem = methodInstantiationElem as RuntimeType;
+
+ if (rtMethodInstantiationElem == null)
+ {
+ Type[] methodInstantiationCopy = new Type[methodInstantiation.Length];
+ for (int iCopy = 0; iCopy < methodInstantiation.Length; iCopy++)
+ methodInstantiationCopy[iCopy] = methodInstantiation[iCopy];
+ methodInstantiation = methodInstantiationCopy;
+ return System.Reflection.Emit.MethodBuilderInstantiation.MakeGenericMethod(this, methodInstantiation);
+ }
+
+ methodInstantionRuntimeType[i] = rtMethodInstantiationElem;
+ }
+
+ RuntimeType[] genericParameters = GetGenericArgumentsInternal();
+
+ RuntimeType.SanityCheckGenericArguments(methodInstantionRuntimeType, genericParameters);
+
+ MethodInfo ret = null;
+
+ try
+ {
+ ret = RuntimeType.GetMethodBase(ReflectedTypeInternal,
+ RuntimeMethodHandle.GetStubIfNeeded(new RuntimeMethodHandleInternal(m_handle), m_declaringType, methodInstantionRuntimeType)) as MethodInfo;
+ }
+ catch (VerificationException e)
+ {
+ RuntimeType.ValidateGenericArguments(this, methodInstantionRuntimeType, e);
+ throw;
+ }
+
+ return ret;
+ }
+
+ internal RuntimeType[] GetGenericArgumentsInternal()
+ {
+ return RuntimeMethodHandle.GetMethodInstantiationInternal(this);
+ }
+
+ public override Type[] GetGenericArguments()
+ {
+ Type[] types = RuntimeMethodHandle.GetMethodInstantiationPublic(this);
+
+ if (types == null)
+ {
+ types = EmptyArray<Type>.Value;
+ }
+ return types;
+ }
+
+ public override MethodInfo GetGenericMethodDefinition()
+ {
+ if (!IsGenericMethod)
+ throw new InvalidOperationException();
+ Contract.EndContractBlock();
+
+ return RuntimeType.GetMethodBase(m_declaringType, RuntimeMethodHandle.StripMethodInstantiation(this)) as MethodInfo;
+ }
+
+ public override bool IsGenericMethod
+ {
+ get { return RuntimeMethodHandle.HasMethodInstantiation(this); }
+ }
+
+ public override bool IsGenericMethodDefinition
+ {
+ get { return RuntimeMethodHandle.IsGenericMethodDefinition(this); }
+ }
+
+ public override bool ContainsGenericParameters
+ {
+ get
+ {
+ if (DeclaringType != null && DeclaringType.ContainsGenericParameters)
+ return true;
+
+ if (!IsGenericMethod)
+ return false;
+
+ Type[] pis = GetGenericArguments();
+ for (int i = 0; i < pis.Length; i++)
+ {
+ if (pis[i].ContainsGenericParameters)
+ return true;
+ }
+
+ return false;
+ }
+ }
+ #endregion
+
+ #region ISerializable Implementation
+ public void GetObjectData(SerializationInfo info, StreamingContext context)
+ {
+ if (info == null)
+ throw new ArgumentNullException(nameof(info));
+ Contract.EndContractBlock();
+
+ if (m_reflectedTypeCache.IsGlobal)
+ throw new NotSupportedException(Environment.GetResourceString("NotSupported_GlobalMethodSerialization"));
+
+ MemberInfoSerializationHolder.GetSerializationInfo(
+ info,
+ Name,
+ ReflectedTypeInternal,
+ ToString(),
+ SerializationToString(),
+ MemberTypes.Method,
+ IsGenericMethod & !IsGenericMethodDefinition ? GetGenericArguments() : null);
+ }
+
+ internal string SerializationToString()
+ {
+ return ReturnType.FormatTypeName(true) + " " + FormatNameAndSig(true);
+ }
+ #endregion
+
+ #region Legacy Internal
+ internal static MethodBase InternalGetCurrentMethod(ref StackCrawlMark stackMark)
+ {
+ IRuntimeMethodInfo method = RuntimeMethodHandle.GetCurrentMethod(ref stackMark);
+
+ if (method == null)
+ return null;
+
+ return RuntimeType.GetMethodBase(method);
+ }
+ #endregion
+ }
+}
--- /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.Runtime.InteropServices;
+using System.Runtime.Serialization;
+using System.Collections.Generic;
+using System.Runtime.CompilerServices;
+using System.Security;
+using System.Globalization;
+using System.Diagnostics.Contracts;
+
+namespace System.Reflection
+{
+ [Serializable]
+ internal class RuntimeModule : Module
+ {
+ internal RuntimeModule() { throw new NotSupportedException(); }
+
+ #region FCalls
+ [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
+ [SuppressUnmanagedCodeSecurity]
+ private extern static void GetType(RuntimeModule module, String className, bool ignoreCase, bool throwOnError, ObjectHandleOnStack type, ObjectHandleOnStack keepAlive);
+
+ [DllImport(JitHelpers.QCall)]
+ [SuppressUnmanagedCodeSecurity]
+ private static extern bool nIsTransientInternal(RuntimeModule module);
+
+ [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
+ [SuppressUnmanagedCodeSecurity]
+ private extern static void GetScopeName(RuntimeModule module, StringHandleOnStack retString);
+
+ [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
+ [SuppressUnmanagedCodeSecurity]
+ private extern static void GetFullyQualifiedName(RuntimeModule module, StringHandleOnStack retString);
+
+ [MethodImplAttribute(MethodImplOptions.InternalCall)]
+ private extern static RuntimeType[] GetTypes(RuntimeModule module);
+
+ internal RuntimeType[] GetDefinedTypes()
+ {
+ return GetTypes(GetNativeHandle());
+ }
+
+ [MethodImplAttribute(MethodImplOptions.InternalCall)]
+ private extern static bool IsResource(RuntimeModule module);
+ #endregion
+
+ #region Module overrides
+ private static RuntimeTypeHandle[] ConvertToTypeHandleArray(Type[] genericArguments)
+ {
+ if (genericArguments == null)
+ return null;
+
+ int size = genericArguments.Length;
+ RuntimeTypeHandle[] typeHandleArgs = new RuntimeTypeHandle[size];
+ for (int i = 0; i < size; i++)
+ {
+ Type typeArg = genericArguments[i];
+ if (typeArg == null)
+ throw new ArgumentException(Environment.GetResourceString("Argument_InvalidGenericInstArray"));
+ typeArg = typeArg.UnderlyingSystemType;
+ if (typeArg == null)
+ throw new ArgumentException(Environment.GetResourceString("Argument_InvalidGenericInstArray"));
+ if (!(typeArg is RuntimeType))
+ throw new ArgumentException(Environment.GetResourceString("Argument_InvalidGenericInstArray"));
+ typeHandleArgs[i] = typeArg.GetTypeHandleInternal();
+ }
+ return typeHandleArgs;
+ }
+
+ public override byte[] ResolveSignature(int metadataToken)
+ {
+ MetadataToken tk = new MetadataToken(metadataToken);
+
+ if (!MetadataImport.IsValidToken(tk))
+ throw new ArgumentOutOfRangeException(nameof(metadataToken),
+ Environment.GetResourceString("Argument_InvalidToken", tk, this));
+
+ if (!tk.IsMemberRef && !tk.IsMethodDef && !tk.IsTypeSpec && !tk.IsSignature && !tk.IsFieldDef)
+ throw new ArgumentException(Environment.GetResourceString("Argument_InvalidToken", tk, this),
+ nameof(metadataToken));
+
+ ConstArray signature;
+ if (tk.IsMemberRef)
+ signature = MetadataImport.GetMemberRefProps(metadataToken);
+ else
+ signature = MetadataImport.GetSignatureFromToken(metadataToken);
+
+ byte[] sig = new byte[signature.Length];
+
+ for (int i = 0; i < signature.Length; i++)
+ sig[i] = signature[i];
+
+ return sig;
+ }
+
+ public override MethodBase ResolveMethod(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments)
+ {
+ MetadataToken tk = new MetadataToken(metadataToken);
+
+ if (!MetadataImport.IsValidToken(tk))
+ throw new ArgumentOutOfRangeException(nameof(metadataToken),
+ Environment.GetResourceString("Argument_InvalidToken", tk, this));
+
+ RuntimeTypeHandle[] typeArgs = ConvertToTypeHandleArray(genericTypeArguments);
+ RuntimeTypeHandle[] methodArgs = ConvertToTypeHandleArray(genericMethodArguments);
+
+ try
+ {
+ if (!tk.IsMethodDef && !tk.IsMethodSpec)
+ {
+ if (!tk.IsMemberRef)
+ throw new ArgumentException(Environment.GetResourceString("Argument_ResolveMethod", tk, this),
+ nameof(metadataToken));
+
+ unsafe
+ {
+ ConstArray sig = MetadataImport.GetMemberRefProps(tk);
+
+ if (*(MdSigCallingConvention*)sig.Signature.ToPointer() == MdSigCallingConvention.Field)
+ throw new ArgumentException(Environment.GetResourceString("Argument_ResolveMethod", tk, this),
+ nameof(metadataToken));
+ }
+ }
+
+ IRuntimeMethodInfo methodHandle = ModuleHandle.ResolveMethodHandleInternal(GetNativeHandle(), tk, typeArgs, methodArgs);
+ Type declaringType = RuntimeMethodHandle.GetDeclaringType(methodHandle);
+
+ if (declaringType.IsGenericType || declaringType.IsArray)
+ {
+ MetadataToken tkDeclaringType = new MetadataToken(MetadataImport.GetParentToken(tk));
+
+ if (tk.IsMethodSpec)
+ tkDeclaringType = new MetadataToken(MetadataImport.GetParentToken(tkDeclaringType));
+
+ declaringType = ResolveType(tkDeclaringType, genericTypeArguments, genericMethodArguments);
+ }
+
+ return System.RuntimeType.GetMethodBase(declaringType as RuntimeType, methodHandle);
+ }
+ catch (BadImageFormatException e)
+ {
+ throw new ArgumentException(Environment.GetResourceString("Argument_BadImageFormatExceptionResolve"), e);
+ }
+ }
+
+ private FieldInfo ResolveLiteralField(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments)
+ {
+ MetadataToken tk = new MetadataToken(metadataToken);
+
+ if (!MetadataImport.IsValidToken(tk) || !tk.IsFieldDef)
+ throw new ArgumentOutOfRangeException(nameof(metadataToken),
+ String.Format(CultureInfo.CurrentUICulture, Environment.GetResourceString("Argument_InvalidToken", tk, this)));
+
+ int tkDeclaringType;
+ string fieldName;
+
+ fieldName = MetadataImport.GetName(tk).ToString();
+ tkDeclaringType = MetadataImport.GetParentToken(tk);
+
+ Type declaringType = ResolveType(tkDeclaringType, genericTypeArguments, genericMethodArguments);
+
+ declaringType.GetFields();
+
+ try
+ {
+ return declaringType.GetField(fieldName,
+ BindingFlags.Static | BindingFlags.Instance |
+ BindingFlags.Public | BindingFlags.NonPublic |
+ BindingFlags.DeclaredOnly);
+ }
+ catch
+ {
+ throw new ArgumentException(Environment.GetResourceString("Argument_ResolveField", tk, this), nameof(metadataToken));
+ }
+ }
+
+ public override FieldInfo ResolveField(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments)
+ {
+ MetadataToken tk = new MetadataToken(metadataToken);
+
+ if (!MetadataImport.IsValidToken(tk))
+ throw new ArgumentOutOfRangeException(nameof(metadataToken),
+ Environment.GetResourceString("Argument_InvalidToken", tk, this));
+
+ RuntimeTypeHandle[] typeArgs = ConvertToTypeHandleArray(genericTypeArguments);
+ RuntimeTypeHandle[] methodArgs = ConvertToTypeHandleArray(genericMethodArguments);
+
+ try
+ {
+ IRuntimeFieldInfo fieldHandle = null;
+
+ if (!tk.IsFieldDef)
+ {
+ if (!tk.IsMemberRef)
+ throw new ArgumentException(Environment.GetResourceString("Argument_ResolveField", tk, this),
+ nameof(metadataToken));
+
+ unsafe
+ {
+ ConstArray sig = MetadataImport.GetMemberRefProps(tk);
+
+ if (*(MdSigCallingConvention*)sig.Signature.ToPointer() != MdSigCallingConvention.Field)
+ throw new ArgumentException(Environment.GetResourceString("Argument_ResolveField", tk, this),
+ nameof(metadataToken));
+ }
+
+ fieldHandle = ModuleHandle.ResolveFieldHandleInternal(GetNativeHandle(), tk, typeArgs, methodArgs);
+ }
+
+ fieldHandle = ModuleHandle.ResolveFieldHandleInternal(GetNativeHandle(), metadataToken, typeArgs, methodArgs);
+ RuntimeType declaringType = RuntimeFieldHandle.GetApproxDeclaringType(fieldHandle.Value);
+
+ if (declaringType.IsGenericType || declaringType.IsArray)
+ {
+ int tkDeclaringType = ModuleHandle.GetMetadataImport(GetNativeHandle()).GetParentToken(metadataToken);
+ declaringType = (RuntimeType)ResolveType(tkDeclaringType, genericTypeArguments, genericMethodArguments);
+ }
+
+ return System.RuntimeType.GetFieldInfo(declaringType, fieldHandle);
+ }
+ catch (MissingFieldException)
+ {
+ return ResolveLiteralField(tk, genericTypeArguments, genericMethodArguments);
+ }
+ catch (BadImageFormatException e)
+ {
+ throw new ArgumentException(Environment.GetResourceString("Argument_BadImageFormatExceptionResolve"), e);
+ }
+ }
+
+ public override Type ResolveType(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments)
+ {
+ MetadataToken tk = new MetadataToken(metadataToken);
+
+ if (tk.IsGlobalTypeDefToken)
+ throw new ArgumentException(Environment.GetResourceString("Argument_ResolveModuleType", tk), nameof(metadataToken));
+
+ if (!MetadataImport.IsValidToken(tk))
+ throw new ArgumentOutOfRangeException(nameof(metadataToken),
+ Environment.GetResourceString("Argument_InvalidToken", tk, this));
+
+ if (!tk.IsTypeDef && !tk.IsTypeSpec && !tk.IsTypeRef)
+ throw new ArgumentException(Environment.GetResourceString("Argument_ResolveType", tk, this), nameof(metadataToken));
+
+ RuntimeTypeHandle[] typeArgs = ConvertToTypeHandleArray(genericTypeArguments);
+ RuntimeTypeHandle[] methodArgs = ConvertToTypeHandleArray(genericMethodArguments);
+
+ try
+ {
+ Type t = GetModuleHandle().ResolveTypeHandle(metadataToken, typeArgs, methodArgs).GetRuntimeType();
+
+ if (t == null)
+ throw new ArgumentException(Environment.GetResourceString("Argument_ResolveType", tk, this), nameof(metadataToken));
+
+ return t;
+ }
+ catch (BadImageFormatException e)
+ {
+ throw new ArgumentException(Environment.GetResourceString("Argument_BadImageFormatExceptionResolve"), e);
+ }
+ }
+
+ public override MemberInfo ResolveMember(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments)
+ {
+ MetadataToken tk = new MetadataToken(metadataToken);
+
+ if (tk.IsProperty)
+ throw new ArgumentException(Environment.GetResourceString("InvalidOperation_PropertyInfoNotAvailable"));
+
+ if (tk.IsEvent)
+ throw new ArgumentException(Environment.GetResourceString("InvalidOperation_EventInfoNotAvailable"));
+
+ if (tk.IsMethodSpec || tk.IsMethodDef)
+ return ResolveMethod(metadataToken, genericTypeArguments, genericMethodArguments);
+
+ if (tk.IsFieldDef)
+ return ResolveField(metadataToken, genericTypeArguments, genericMethodArguments);
+
+ if (tk.IsTypeRef || tk.IsTypeDef || tk.IsTypeSpec)
+ return ResolveType(metadataToken, genericTypeArguments, genericMethodArguments);
+
+ if (tk.IsMemberRef)
+ {
+ if (!MetadataImport.IsValidToken(tk))
+ throw new ArgumentOutOfRangeException(nameof(metadataToken),
+ Environment.GetResourceString("Argument_InvalidToken", tk, this));
+
+ ConstArray sig = MetadataImport.GetMemberRefProps(tk);
+
+ unsafe
+ {
+ if (*(MdSigCallingConvention*)sig.Signature.ToPointer() == MdSigCallingConvention.Field)
+ {
+ return ResolveField(tk, genericTypeArguments, genericMethodArguments);
+ }
+ else
+ {
+ return ResolveMethod(tk, genericTypeArguments, genericMethodArguments);
+ }
+ }
+ }
+
+ throw new ArgumentException(Environment.GetResourceString("Argument_ResolveMember", tk, this),
+ nameof(metadataToken));
+ }
+
+ public override string ResolveString(int metadataToken)
+ {
+ MetadataToken tk = new MetadataToken(metadataToken);
+ if (!tk.IsString)
+ throw new ArgumentException(
+ String.Format(CultureInfo.CurrentUICulture, Environment.GetResourceString("Argument_ResolveString"), metadataToken, ToString()));
+
+ if (!MetadataImport.IsValidToken(tk))
+ throw new ArgumentOutOfRangeException(nameof(metadataToken),
+ String.Format(CultureInfo.CurrentUICulture, Environment.GetResourceString("Argument_InvalidToken", tk, this)));
+
+ string str = MetadataImport.GetUserString(metadataToken);
+
+ if (str == null)
+ throw new ArgumentException(
+ String.Format(CultureInfo.CurrentUICulture, Environment.GetResourceString("Argument_ResolveString"), metadataToken, ToString()));
+
+ return str;
+ }
+
+ public override void GetPEKind(out PortableExecutableKinds peKind, out ImageFileMachine machine)
+ {
+ ModuleHandle.GetPEKind(GetNativeHandle(), out peKind, out machine);
+ }
+
+ public override int MDStreamVersion
+ {
+ get
+ {
+ return ModuleHandle.GetMDStreamVersion(GetNativeHandle());
+ }
+ }
+ #endregion
+
+ #region Data Members
+#pragma warning disable 169
+ // If you add any data members, you need to update the native declaration ReflectModuleBaseObject.
+ private RuntimeType m_runtimeType;
+ private RuntimeAssembly m_runtimeAssembly;
+ private IntPtr m_pRefClass;
+ private IntPtr m_pData;
+ private IntPtr m_pGlobals;
+ private IntPtr m_pFields;
+#pragma warning restore 169
+ #endregion
+
+ #region Protected Virtuals
+ protected override MethodInfo GetMethodImpl(String name, BindingFlags bindingAttr, Binder binder,
+ CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers)
+ {
+ return GetMethodInternal(name, bindingAttr, binder, callConvention, types, modifiers);
+ }
+
+ internal MethodInfo GetMethodInternal(String name, BindingFlags bindingAttr, Binder binder,
+ CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers)
+ {
+ if (RuntimeType == null)
+ return null;
+
+ if (types == null)
+ {
+ return RuntimeType.GetMethod(name, bindingAttr);
+ }
+ else
+ {
+ return RuntimeType.GetMethod(name, bindingAttr, binder, callConvention, types, modifiers);
+ }
+ }
+ #endregion
+
+ #region Internal Members
+ internal RuntimeType RuntimeType
+ {
+ get
+ {
+ if (m_runtimeType == null)
+ m_runtimeType = ModuleHandle.GetModuleType(GetNativeHandle());
+
+ return m_runtimeType;
+ }
+ }
+
+ internal bool IsTransientInternal()
+ {
+ return RuntimeModule.nIsTransientInternal(this.GetNativeHandle());
+ }
+
+ internal MetadataImport MetadataImport
+ {
+ get
+ {
+ unsafe
+ {
+ return ModuleHandle.GetMetadataImport(GetNativeHandle());
+ }
+ }
+ }
+ #endregion
+
+ #region ICustomAttributeProvider Members
+ public override Object[] GetCustomAttributes(bool inherit)
+ {
+ return CustomAttribute.GetCustomAttributes(this, typeof(object) as RuntimeType);
+ }
+
+ public override Object[] GetCustomAttributes(Type attributeType, bool inherit)
+ {
+ if (attributeType == null)
+ throw new ArgumentNullException(nameof(attributeType));
+ Contract.EndContractBlock();
+
+ RuntimeType attributeRuntimeType = attributeType.UnderlyingSystemType as RuntimeType;
+
+ if (attributeRuntimeType == null)
+ throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"), nameof(attributeType));
+
+ return CustomAttribute.GetCustomAttributes(this, attributeRuntimeType);
+ }
+
+ public override bool IsDefined(Type attributeType, bool inherit)
+ {
+ if (attributeType == null)
+ throw new ArgumentNullException(nameof(attributeType));
+ Contract.EndContractBlock();
+
+ RuntimeType attributeRuntimeType = attributeType.UnderlyingSystemType as RuntimeType;
+
+ if (attributeRuntimeType == null)
+ throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"), nameof(attributeType));
+
+ return CustomAttribute.IsDefined(this, attributeRuntimeType);
+ }
+
+ public override IList<CustomAttributeData> GetCustomAttributesData()
+ {
+ return CustomAttributeData.GetCustomAttributesInternal(this);
+ }
+ #endregion
+
+ #region Public Virtuals
+ public override void GetObjectData(SerializationInfo info, StreamingContext context)
+ {
+ if (info == null)
+ {
+ throw new ArgumentNullException(nameof(info));
+ }
+ Contract.EndContractBlock();
+ UnitySerializationHolder.GetUnitySerializationInfo(info, UnitySerializationHolder.ModuleUnity, this.ScopeName, this.GetRuntimeAssembly());
+ }
+
+ public override Type GetType(String className, bool throwOnError, bool ignoreCase)
+ {
+ // throw on null strings regardless of the value of "throwOnError"
+ if (className == null)
+ throw new ArgumentNullException(nameof(className));
+
+ RuntimeType retType = null;
+ Object keepAlive = null;
+ GetType(GetNativeHandle(), className, throwOnError, ignoreCase, JitHelpers.GetObjectHandleOnStack(ref retType), JitHelpers.GetObjectHandleOnStack(ref keepAlive));
+ GC.KeepAlive(keepAlive);
+ return retType;
+ }
+
+ internal string GetFullyQualifiedName()
+ {
+ String fullyQualifiedName = null;
+ GetFullyQualifiedName(GetNativeHandle(), JitHelpers.GetStringHandleOnStack(ref fullyQualifiedName));
+ return fullyQualifiedName;
+ }
+
+ public override String FullyQualifiedName
+ {
+ get
+ {
+ return GetFullyQualifiedName();
+ }
+ }
+
+ public override Type[] GetTypes()
+ {
+ return GetTypes(GetNativeHandle());
+ }
+
+ #endregion
+
+ #region Public Members
+
+ public override Guid ModuleVersionId
+ {
+ get
+ {
+ unsafe
+ {
+ Guid mvid;
+ MetadataImport.GetScopeProps(out mvid);
+ return mvid;
+ }
+ }
+ }
+
+ public override int MetadataToken
+ {
+ get
+ {
+ return ModuleHandle.GetToken(GetNativeHandle());
+ }
+ }
+
+ public override bool IsResource()
+ {
+ return IsResource(GetNativeHandle());
+ }
+
+ public override FieldInfo[] GetFields(BindingFlags bindingFlags)
+ {
+ if (RuntimeType == null)
+ return new FieldInfo[0];
+
+ return RuntimeType.GetFields(bindingFlags);
+ }
+
+ public override FieldInfo GetField(String name, BindingFlags bindingAttr)
+ {
+ if (name == null)
+ throw new ArgumentNullException(nameof(name));
+
+ if (RuntimeType == null)
+ return null;
+
+ return RuntimeType.GetField(name, bindingAttr);
+ }
+
+ public override MethodInfo[] GetMethods(BindingFlags bindingFlags)
+ {
+ if (RuntimeType == null)
+ return new MethodInfo[0];
+
+ return RuntimeType.GetMethods(bindingFlags);
+ }
+
+ public override String ScopeName
+ {
+ get
+ {
+ string scopeName = null;
+ GetScopeName(GetNativeHandle(), JitHelpers.GetStringHandleOnStack(ref scopeName));
+ return scopeName;
+ }
+ }
+
+ public override String Name
+ {
+ get
+ {
+ String s = GetFullyQualifiedName();
+
+#if !FEATURE_PAL
+ int i = s.LastIndexOf('\\');
+#else
+ int i = s.LastIndexOf(System.IO.Path.DirectorySeparatorChar);
+#endif
+ if (i == -1)
+ return s;
+
+ return s.Substring(i + 1);
+ }
+ }
+
+ public override Assembly Assembly
+ {
+ [Pure]
+ get
+ {
+ return GetRuntimeAssembly();
+ }
+ }
+
+ internal RuntimeAssembly GetRuntimeAssembly()
+ {
+ return m_runtimeAssembly;
+ }
+
+
+ internal override ModuleHandle GetModuleHandle()
+ {
+ return new ModuleHandle(this);
+ }
+
+ internal RuntimeModule GetNativeHandle()
+ {
+ return this;
+ }
+ #endregion
+ }
+}
--- /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.Collections.Generic;
+using System.Diagnostics.Contracts;
+using System.Runtime.Serialization;
+using System.Runtime.CompilerServices;
+using MdToken = System.Reflection.MetadataToken;
+
+namespace System.Reflection
+{
+ [Serializable]
+ internal unsafe sealed class RuntimeParameterInfo : ParameterInfo, ISerializable
+ {
+ #region Static Members
+ internal unsafe static ParameterInfo[] GetParameters(IRuntimeMethodInfo method, MemberInfo member, Signature sig)
+ {
+ Debug.Assert(method is RuntimeMethodInfo || method is RuntimeConstructorInfo);
+
+ ParameterInfo dummy;
+ return GetParameters(method, member, sig, out dummy, false);
+ }
+
+ internal unsafe static ParameterInfo GetReturnParameter(IRuntimeMethodInfo method, MemberInfo member, Signature sig)
+ {
+ Debug.Assert(method is RuntimeMethodInfo || method is RuntimeConstructorInfo);
+
+ ParameterInfo returnParameter;
+ GetParameters(method, member, sig, out returnParameter, true);
+ return returnParameter;
+ }
+
+ internal unsafe static ParameterInfo[] GetParameters(
+ IRuntimeMethodInfo methodHandle, MemberInfo member, Signature sig, out ParameterInfo returnParameter, bool fetchReturnParameter)
+ {
+ returnParameter = null;
+ int sigArgCount = sig.Arguments.Length;
+ ParameterInfo[] args = fetchReturnParameter ? null : new ParameterInfo[sigArgCount];
+
+ int tkMethodDef = RuntimeMethodHandle.GetMethodDef(methodHandle);
+ int cParamDefs = 0;
+
+ // Not all methods have tokens. Arrays, pointers and byRef types do not have tokens as they
+ // are generated on the fly by the runtime.
+ if (!MdToken.IsNullToken(tkMethodDef))
+ {
+ MetadataImport scope = RuntimeTypeHandle.GetMetadataImport(RuntimeMethodHandle.GetDeclaringType(methodHandle));
+
+ MetadataEnumResult tkParamDefs;
+ scope.EnumParams(tkMethodDef, out tkParamDefs);
+
+ cParamDefs = tkParamDefs.Length;
+
+ // Not all parameters have tokens. Parameters may have no token
+ // if they have no name and no attributes.
+ if (cParamDefs > sigArgCount + 1 /* return type */)
+ throw new BadImageFormatException(Environment.GetResourceString("BadImageFormat_ParameterSignatureMismatch"));
+
+ for (int i = 0; i < cParamDefs; i++)
+ {
+ #region Populate ParameterInfos
+ ParameterAttributes attr;
+ int position, tkParamDef = tkParamDefs[i];
+
+ scope.GetParamDefProps(tkParamDef, out position, out attr);
+
+ position--;
+
+ if (fetchReturnParameter == true && position == -1)
+ {
+ // more than one return parameter?
+ if (returnParameter != null)
+ throw new BadImageFormatException(Environment.GetResourceString("BadImageFormat_ParameterSignatureMismatch"));
+
+ returnParameter = new RuntimeParameterInfo(sig, scope, tkParamDef, position, attr, member);
+ }
+ else if (fetchReturnParameter == false && position >= 0)
+ {
+ // position beyong sigArgCount?
+ if (position >= sigArgCount)
+ throw new BadImageFormatException(Environment.GetResourceString("BadImageFormat_ParameterSignatureMismatch"));
+
+ args[position] = new RuntimeParameterInfo(sig, scope, tkParamDef, position, attr, member);
+ }
+ #endregion
+ }
+ }
+
+ // Fill in empty ParameterInfos for those without tokens
+ if (fetchReturnParameter)
+ {
+ if (returnParameter == null)
+ {
+ returnParameter = new RuntimeParameterInfo(sig, MetadataImport.EmptyImport, 0, -1, (ParameterAttributes)0, member);
+ }
+ }
+ else
+ {
+ if (cParamDefs < args.Length + 1)
+ {
+ for (int i = 0; i < args.Length; i++)
+ {
+ if (args[i] != null)
+ continue;
+
+ args[i] = new RuntimeParameterInfo(sig, MetadataImport.EmptyImport, 0, i, (ParameterAttributes)0, member);
+ }
+ }
+ }
+
+ return args;
+ }
+ #endregion
+
+ #region Private Statics
+ private static readonly Type s_DecimalConstantAttributeType = typeof(DecimalConstantAttribute);
+ private static readonly Type s_CustomConstantAttributeType = typeof(CustomConstantAttribute);
+ #endregion
+
+ #region Private Data Members
+ // These are new in Whidbey, so we cannot serialize them directly or we break backwards compatibility.
+ [NonSerialized]
+ private int m_tkParamDef;
+ [NonSerialized]
+ private MetadataImport m_scope;
+ [NonSerialized]
+ private Signature m_signature;
+ [NonSerialized]
+ private volatile bool m_nameIsCached = false;
+ [NonSerialized]
+ private readonly bool m_noMetadata = false;
+ [NonSerialized]
+ private bool m_noDefaultValue = false;
+ [NonSerialized]
+ private MethodBase m_originalMember = null;
+ #endregion
+
+ #region Internal Properties
+ internal MethodBase DefiningMethod
+ {
+ get
+ {
+ MethodBase result = m_originalMember != null ? m_originalMember : MemberImpl as MethodBase;
+ Debug.Assert(result != null);
+ return result;
+ }
+ }
+ #endregion
+
+ #region VTS magic to serialize/deserialized to/from pre-Whidbey endpoints.
+ public void GetObjectData(SerializationInfo info, StreamingContext context)
+ {
+ if (info == null)
+ throw new ArgumentNullException(nameof(info));
+ Contract.EndContractBlock();
+
+ // We could be serializing for consumption by a pre-Whidbey
+ // endpoint. Therefore we set up all the serialized fields to look
+ // just like a v1.0/v1.1 instance.
+
+ // Need to set the type to ParameterInfo so that pre-Whidbey and Whidbey code
+ // can deserialize this. This is also why we cannot simply use [OnSerializing].
+ info.SetType(typeof(ParameterInfo));
+
+ // Use the properties intead of the fields in case the fields haven't been et
+ // _importer, bExtraConstChecked, and m_cachedData don't need to be set
+
+ // Now set the legacy fields that the current implementation doesn't
+ // use any more. Note that _importer is a raw pointer that should
+ // never have been serialized in V1. We set it to zero here; if the
+ // deserializer uses it (by calling GetCustomAttributes() on this
+ // instance) they'll AV, but at least it will be a well defined
+ // exception and not a random AV.
+
+ info.AddValue("AttrsImpl", Attributes);
+ info.AddValue("ClassImpl", ParameterType);
+ info.AddValue("DefaultValueImpl", DefaultValue);
+ info.AddValue("MemberImpl", Member);
+ info.AddValue("NameImpl", Name);
+ info.AddValue("PositionImpl", Position);
+ info.AddValue("_token", m_tkParamDef);
+ }
+ #endregion
+
+ #region Constructor
+ // used by RuntimePropertyInfo
+ internal RuntimeParameterInfo(RuntimeParameterInfo accessor, RuntimePropertyInfo property)
+ : this(accessor, (MemberInfo)property)
+ {
+ m_signature = property.Signature;
+ }
+
+ private RuntimeParameterInfo(RuntimeParameterInfo accessor, MemberInfo member)
+ {
+ // Change ownership
+ MemberImpl = member;
+
+ // The original owner should always be a method, because this method is only used to
+ // change the owner from a method to a property.
+ m_originalMember = accessor.MemberImpl as MethodBase;
+ Debug.Assert(m_originalMember != null);
+
+ // Populate all the caches -- we inherit this behavior from RTM
+ NameImpl = accessor.Name;
+ m_nameIsCached = true;
+ ClassImpl = accessor.ParameterType;
+ PositionImpl = accessor.Position;
+ AttrsImpl = accessor.Attributes;
+
+ // Strictly speeking, property's don't contain paramter tokens
+ // However we need this to make ca's work... oh well...
+ m_tkParamDef = MdToken.IsNullToken(accessor.MetadataToken) ? (int)MetadataTokenType.ParamDef : accessor.MetadataToken;
+ m_scope = accessor.m_scope;
+ }
+
+ private RuntimeParameterInfo(
+ Signature signature, MetadataImport scope, int tkParamDef,
+ int position, ParameterAttributes attributes, MemberInfo member)
+ {
+ Contract.Requires(member != null);
+ Debug.Assert(MdToken.IsNullToken(tkParamDef) == scope.Equals(MetadataImport.EmptyImport));
+ Debug.Assert(MdToken.IsNullToken(tkParamDef) || MdToken.IsTokenOfType(tkParamDef, MetadataTokenType.ParamDef));
+
+ PositionImpl = position;
+ MemberImpl = member;
+ m_signature = signature;
+ m_tkParamDef = MdToken.IsNullToken(tkParamDef) ? (int)MetadataTokenType.ParamDef : tkParamDef;
+ m_scope = scope;
+ AttrsImpl = attributes;
+
+ ClassImpl = null;
+ NameImpl = null;
+ }
+
+ // ctor for no metadata MethodInfo in the DynamicMethod and RuntimeMethodInfo cases
+ internal RuntimeParameterInfo(MethodInfo owner, String name, Type parameterType, int position)
+ {
+ MemberImpl = owner;
+ NameImpl = name;
+ m_nameIsCached = true;
+ m_noMetadata = true;
+ ClassImpl = parameterType;
+ PositionImpl = position;
+ AttrsImpl = ParameterAttributes.None;
+ m_tkParamDef = (int)MetadataTokenType.ParamDef;
+ m_scope = MetadataImport.EmptyImport;
+ }
+ #endregion
+
+ #region Public Methods
+ public override Type ParameterType
+ {
+ get
+ {
+ // only instance of ParameterInfo has ClassImpl, all its subclasses don't
+ if (ClassImpl == null)
+ {
+ RuntimeType parameterType;
+ if (PositionImpl == -1)
+ parameterType = m_signature.ReturnType;
+ else
+ parameterType = m_signature.Arguments[PositionImpl];
+
+ Debug.Assert(parameterType != null);
+ // different thread could only write ClassImpl to the same value, so a race condition is not a problem here
+ ClassImpl = parameterType;
+ }
+
+ return ClassImpl;
+ }
+ }
+
+ public override String Name
+ {
+ get
+ {
+ if (!m_nameIsCached)
+ {
+ if (!MdToken.IsNullToken(m_tkParamDef))
+ {
+ string name;
+ name = m_scope.GetName(m_tkParamDef).ToString();
+ NameImpl = name;
+ }
+
+ // other threads could only write it to true, so a race condition is OK
+ // this field is volatile, so the write ordering is guaranteed
+ m_nameIsCached = true;
+ }
+
+ // name may be null
+ return NameImpl;
+ }
+ }
+
+ public override bool HasDefaultValue
+ {
+ get
+ {
+ if (m_noMetadata || m_noDefaultValue)
+ return false;
+
+ object defaultValue = GetDefaultValueInternal(false);
+
+ return (defaultValue != DBNull.Value);
+ }
+ }
+
+ public override Object DefaultValue { get { return GetDefaultValue(false); } }
+ public override Object RawDefaultValue { get { return GetDefaultValue(true); } }
+
+ private Object GetDefaultValue(bool raw)
+ {
+ // OLD COMMENT (Is this even true?)
+ // Cannot cache because default value could be non-agile user defined enumeration.
+ // OLD COMMENT ends
+ if (m_noMetadata)
+ return null;
+
+ // for dynamic method we pretend to have cached the value so we do not go to metadata
+ object defaultValue = GetDefaultValueInternal(raw);
+
+ if (defaultValue == DBNull.Value)
+ {
+ #region Handle case if no default value was found
+ if (IsOptional)
+ {
+ // If the argument is marked as optional then the default value is Missing.Value.
+ defaultValue = Type.Missing;
+ }
+ #endregion
+ }
+
+ return defaultValue;
+ }
+
+ // returns DBNull.Value if the parameter doesn't have a default value
+ private Object GetDefaultValueInternal(bool raw)
+ {
+ Debug.Assert(!m_noMetadata);
+
+ if (m_noDefaultValue)
+ return DBNull.Value;
+
+ object defaultValue = null;
+
+ // Why check the parameter type only for DateTime and only for the ctor arguments?
+ // No check on the parameter type is done for named args and for Decimal.
+
+ // We should move this after MdToken.IsNullToken(m_tkParamDef) and combine it
+ // with the other custom attribute logic. But will that be a breaking change?
+ // For a DateTime parameter on which both an md constant and a ca constant are set,
+ // which one should win?
+ if (ParameterType == typeof(DateTime))
+ {
+ if (raw)
+ {
+ CustomAttributeTypedArgument value =
+ CustomAttributeData.Filter(
+ CustomAttributeData.GetCustomAttributes(this), typeof(DateTimeConstantAttribute), 0);
+
+ if (value.ArgumentType != null)
+ return new DateTime((long)value.Value);
+ }
+ else
+ {
+ object[] dt = GetCustomAttributes(typeof(DateTimeConstantAttribute), false);
+ if (dt != null && dt.Length != 0)
+ return ((DateTimeConstantAttribute)dt[0]).Value;
+ }
+ }
+
+ #region Look for a default value in metadata
+ if (!MdToken.IsNullToken(m_tkParamDef))
+ {
+ // This will return DBNull.Value if no constant value is defined on m_tkParamDef in the metadata.
+ defaultValue = MdConstant.GetValue(m_scope, m_tkParamDef, ParameterType.GetTypeHandleInternal(), raw);
+ }
+ #endregion
+
+ if (defaultValue == DBNull.Value)
+ {
+ #region Look for a default value in the custom attributes
+ if (raw)
+ {
+ foreach (CustomAttributeData attr in CustomAttributeData.GetCustomAttributes(this))
+ {
+ Type attrType = attr.Constructor.DeclaringType;
+
+ if (attrType == typeof(DateTimeConstantAttribute))
+ {
+ defaultValue = DateTimeConstantAttribute.GetRawDateTimeConstant(attr);
+ }
+ else if (attrType == typeof(DecimalConstantAttribute))
+ {
+ defaultValue = DecimalConstantAttribute.GetRawDecimalConstant(attr);
+ }
+ else if (attrType.IsSubclassOf(s_CustomConstantAttributeType))
+ {
+ defaultValue = CustomConstantAttribute.GetRawConstant(attr);
+ }
+ }
+ }
+ else
+ {
+ Object[] CustomAttrs = GetCustomAttributes(s_CustomConstantAttributeType, false);
+ if (CustomAttrs.Length != 0)
+ {
+ defaultValue = ((CustomConstantAttribute)CustomAttrs[0]).Value;
+ }
+ else
+ {
+ CustomAttrs = GetCustomAttributes(s_DecimalConstantAttributeType, false);
+ if (CustomAttrs.Length != 0)
+ {
+ defaultValue = ((DecimalConstantAttribute)CustomAttrs[0]).Value;
+ }
+ }
+ }
+ #endregion
+ }
+
+ if (defaultValue == DBNull.Value)
+ m_noDefaultValue = true;
+
+ return defaultValue;
+ }
+
+ internal RuntimeModule GetRuntimeModule()
+ {
+ RuntimeMethodInfo method = Member as RuntimeMethodInfo;
+ RuntimeConstructorInfo constructor = Member as RuntimeConstructorInfo;
+ RuntimePropertyInfo property = Member as RuntimePropertyInfo;
+
+ if (method != null)
+ return method.GetRuntimeModule();
+ else if (constructor != null)
+ return constructor.GetRuntimeModule();
+ else if (property != null)
+ return property.GetRuntimeModule();
+ else
+ return null;
+ }
+
+ public override int MetadataToken
+ {
+ get
+ {
+ return m_tkParamDef;
+ }
+ }
+
+ public override Type[] GetRequiredCustomModifiers()
+ {
+ return m_signature.GetCustomModifiers(PositionImpl + 1, true);
+ }
+
+ public override Type[] GetOptionalCustomModifiers()
+ {
+ return m_signature.GetCustomModifiers(PositionImpl + 1, false);
+ }
+
+ #endregion
+
+ #region ICustomAttributeProvider
+ public override Object[] GetCustomAttributes(bool inherit)
+ {
+ if (MdToken.IsNullToken(m_tkParamDef))
+ return EmptyArray<Object>.Value;
+
+ return CustomAttribute.GetCustomAttributes(this, typeof(object) as RuntimeType);
+ }
+
+ public override Object[] GetCustomAttributes(Type attributeType, bool inherit)
+ {
+ if (attributeType == null)
+ throw new ArgumentNullException(nameof(attributeType));
+ Contract.EndContractBlock();
+
+ if (MdToken.IsNullToken(m_tkParamDef))
+ return EmptyArray<Object>.Value;
+
+ RuntimeType attributeRuntimeType = attributeType.UnderlyingSystemType as RuntimeType;
+
+ if (attributeRuntimeType == null)
+ throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"), nameof(attributeType));
+
+ return CustomAttribute.GetCustomAttributes(this, attributeRuntimeType);
+ }
+
+ public override bool IsDefined(Type attributeType, bool inherit)
+ {
+ if (attributeType == null)
+ throw new ArgumentNullException(nameof(attributeType));
+ Contract.EndContractBlock();
+
+ if (MdToken.IsNullToken(m_tkParamDef))
+ return false;
+
+ RuntimeType attributeRuntimeType = attributeType.UnderlyingSystemType as RuntimeType;
+
+ if (attributeRuntimeType == null)
+ throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"), nameof(attributeType));
+
+ return CustomAttribute.IsDefined(this, attributeRuntimeType);
+ }
+
+ public override IList<CustomAttributeData> GetCustomAttributesData()
+ {
+ return CustomAttributeData.GetCustomAttributesInternal(this);
+ }
+ #endregion
+ }
+}
--- /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.Collections.Generic;
+using System.Diagnostics;
+using System.Diagnostics.Contracts;
+using System.Globalization;
+using System.Runtime.Serialization;
+using System.Text;
+using RuntimeTypeCache = System.RuntimeType.RuntimeTypeCache;
+
+namespace System.Reflection
+{
+ [Serializable]
+ internal unsafe sealed class RuntimePropertyInfo : PropertyInfo, ISerializable
+ {
+ #region Private Data Members
+ private int m_token;
+ private string m_name;
+ private void* m_utf8name;
+ private PropertyAttributes m_flags;
+ private RuntimeTypeCache m_reflectedTypeCache;
+ private RuntimeMethodInfo m_getterMethod;
+ private RuntimeMethodInfo m_setterMethod;
+ private MethodInfo[] m_otherMethod;
+ private RuntimeType m_declaringType;
+ private BindingFlags m_bindingFlags;
+ private Signature m_signature;
+ private ParameterInfo[] m_parameters;
+ #endregion
+
+ #region Constructor
+ internal RuntimePropertyInfo(
+ int tkProperty, RuntimeType declaredType, RuntimeTypeCache reflectedTypeCache, out bool isPrivate)
+ {
+ Contract.Requires(declaredType != null);
+ Contract.Requires(reflectedTypeCache != null);
+ Debug.Assert(!reflectedTypeCache.IsGlobal);
+
+ MetadataImport scope = declaredType.GetRuntimeModule().MetadataImport;
+
+ m_token = tkProperty;
+ m_reflectedTypeCache = reflectedTypeCache;
+ m_declaringType = declaredType;
+
+ ConstArray sig;
+ scope.GetPropertyProps(tkProperty, out m_utf8name, out m_flags, out sig);
+
+ RuntimeMethodInfo dummy;
+ Associates.AssignAssociates(scope, tkProperty, declaredType, reflectedTypeCache.GetRuntimeType(),
+ out dummy, out dummy, out dummy,
+ out m_getterMethod, out m_setterMethod, out m_otherMethod,
+ out isPrivate, out m_bindingFlags);
+ }
+ #endregion
+
+ #region Internal Members
+ internal override bool CacheEquals(object o)
+ {
+ RuntimePropertyInfo m = o as RuntimePropertyInfo;
+
+ if ((object)m == null)
+ return false;
+
+ return m.m_token == m_token &&
+ RuntimeTypeHandle.GetModule(m_declaringType).Equals(
+ RuntimeTypeHandle.GetModule(m.m_declaringType));
+ }
+
+ internal Signature Signature
+ {
+ get
+ {
+ if (m_signature == null)
+ {
+ PropertyAttributes flags;
+ ConstArray sig;
+
+ void* name;
+ GetRuntimeModule().MetadataImport.GetPropertyProps(
+ m_token, out name, out flags, out sig);
+
+ m_signature = new Signature(sig.Signature.ToPointer(), (int)sig.Length, m_declaringType);
+ }
+
+ return m_signature;
+ }
+ }
+ internal bool EqualsSig(RuntimePropertyInfo target)
+ {
+ //@Asymmetry - Legacy policy is to remove duplicate properties, including hidden properties.
+ // The comparison is done by name and by sig. The EqualsSig comparison is expensive
+ // but forutnetly it is only called when an inherited property is hidden by name or
+ // when an interfaces declare properies with the same signature.
+ // Note that we intentionally don't resolve generic arguments so that we don't treat
+ // signatures that only match in certain instantiations as duplicates. This has the
+ // down side of treating overriding and overriden properties as different properties
+ // in some cases. But PopulateProperties in rttype.cs should have taken care of that
+ // by comparing VTable slots.
+ //
+ // Class C1(Of T, Y)
+ // Property Prop1(ByVal t1 As T) As Integer
+ // Get
+ // ... ...
+ // End Get
+ // End Property
+ // Property Prop1(ByVal y1 As Y) As Integer
+ // Get
+ // ... ...
+ // End Get
+ // End Property
+ // End Class
+ //
+
+ Contract.Requires(Name.Equals(target.Name));
+ Contract.Requires(this != target);
+ Contract.Requires(this.ReflectedType == target.ReflectedType);
+
+ return Signature.CompareSig(this.Signature, target.Signature);
+ }
+ internal BindingFlags BindingFlags { get { return m_bindingFlags; } }
+ #endregion
+
+ #region Object Overrides
+ public override String ToString()
+ {
+ return FormatNameAndSig(false);
+ }
+
+ private string FormatNameAndSig(bool serialization)
+ {
+ StringBuilder sbName = new StringBuilder(PropertyType.FormatTypeName(serialization));
+
+ sbName.Append(" ");
+ sbName.Append(Name);
+
+ RuntimeType[] arguments = Signature.Arguments;
+ if (arguments.Length > 0)
+ {
+ sbName.Append(" [");
+ sbName.Append(MethodBase.ConstructParameters(arguments, Signature.CallingConvention, serialization));
+ sbName.Append("]");
+ }
+
+ return sbName.ToString();
+ }
+ #endregion
+
+ #region ICustomAttributeProvider
+ public override Object[] GetCustomAttributes(bool inherit)
+ {
+ return CustomAttribute.GetCustomAttributes(this, typeof(object) as RuntimeType);
+ }
+
+ public override Object[] GetCustomAttributes(Type attributeType, bool inherit)
+ {
+ if (attributeType == null)
+ throw new ArgumentNullException(nameof(attributeType));
+ Contract.EndContractBlock();
+
+ RuntimeType attributeRuntimeType = attributeType.UnderlyingSystemType as RuntimeType;
+
+ if (attributeRuntimeType == null)
+ throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"), nameof(attributeType));
+
+ return CustomAttribute.GetCustomAttributes(this, attributeRuntimeType);
+ }
+
+ public override bool IsDefined(Type attributeType, bool inherit)
+ {
+ if (attributeType == null)
+ throw new ArgumentNullException(nameof(attributeType));
+ Contract.EndContractBlock();
+
+ RuntimeType attributeRuntimeType = attributeType.UnderlyingSystemType as RuntimeType;
+
+ if (attributeRuntimeType == null)
+ throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"), nameof(attributeType));
+
+ return CustomAttribute.IsDefined(this, attributeRuntimeType);
+ }
+
+ public override IList<CustomAttributeData> GetCustomAttributesData()
+ {
+ return CustomAttributeData.GetCustomAttributesInternal(this);
+ }
+ #endregion
+
+ #region MemberInfo Overrides
+ public override MemberTypes MemberType { get { return MemberTypes.Property; } }
+ public override String Name
+ {
+ get
+ {
+ if (m_name == null)
+ m_name = new Utf8String(m_utf8name).ToString();
+
+ return m_name;
+ }
+ }
+ public override Type DeclaringType
+ {
+ get
+ {
+ return m_declaringType;
+ }
+ }
+
+ public override Type ReflectedType
+ {
+ get
+ {
+ return ReflectedTypeInternal;
+ }
+ }
+
+ private RuntimeType ReflectedTypeInternal
+ {
+ get
+ {
+ return m_reflectedTypeCache.GetRuntimeType();
+ }
+ }
+
+ public override int MetadataToken { get { return m_token; } }
+
+ public override Module Module { get { return GetRuntimeModule(); } }
+ internal RuntimeModule GetRuntimeModule() { return m_declaringType.GetRuntimeModule(); }
+ #endregion
+
+ #region PropertyInfo Overrides
+
+ #region Non Dynamic
+
+ public override Type[] GetRequiredCustomModifiers()
+ {
+ return Signature.GetCustomModifiers(0, true);
+ }
+
+ public override Type[] GetOptionalCustomModifiers()
+ {
+ return Signature.GetCustomModifiers(0, false);
+ }
+
+ internal object GetConstantValue(bool raw)
+ {
+ Object defaultValue = MdConstant.GetValue(GetRuntimeModule().MetadataImport, m_token, PropertyType.GetTypeHandleInternal(), raw);
+
+ if (defaultValue == DBNull.Value)
+ // Arg_EnumLitValueNotFound -> "Literal value was not found."
+ throw new InvalidOperationException(Environment.GetResourceString("Arg_EnumLitValueNotFound"));
+
+ return defaultValue;
+ }
+
+ public override object GetConstantValue() { return GetConstantValue(false); }
+
+ public override object GetRawConstantValue() { return GetConstantValue(true); }
+
+ public override MethodInfo[] GetAccessors(bool nonPublic)
+ {
+ List<MethodInfo> accessorList = new List<MethodInfo>();
+
+ if (Associates.IncludeAccessor(m_getterMethod, nonPublic))
+ accessorList.Add(m_getterMethod);
+
+ if (Associates.IncludeAccessor(m_setterMethod, nonPublic))
+ accessorList.Add(m_setterMethod);
+
+ if ((object)m_otherMethod != null)
+ {
+ for (int i = 0; i < m_otherMethod.Length; i++)
+ {
+ if (Associates.IncludeAccessor(m_otherMethod[i] as MethodInfo, nonPublic))
+ accessorList.Add(m_otherMethod[i]);
+ }
+ }
+ return accessorList.ToArray();
+ }
+
+ public override Type PropertyType
+ {
+ get { return Signature.ReturnType; }
+ }
+
+ public override MethodInfo GetGetMethod(bool nonPublic)
+ {
+ if (!Associates.IncludeAccessor(m_getterMethod, nonPublic))
+ return null;
+
+ return m_getterMethod;
+ }
+
+ public override MethodInfo GetSetMethod(bool nonPublic)
+ {
+ if (!Associates.IncludeAccessor(m_setterMethod, nonPublic))
+ return null;
+
+ return m_setterMethod;
+ }
+
+ public override ParameterInfo[] GetIndexParameters()
+ {
+ ParameterInfo[] indexParams = GetIndexParametersNoCopy();
+
+ int numParams = indexParams.Length;
+
+ if (numParams == 0)
+ return indexParams;
+
+ ParameterInfo[] ret = new ParameterInfo[numParams];
+
+ Array.Copy(indexParams, ret, numParams);
+
+ return ret;
+ }
+
+ internal ParameterInfo[] GetIndexParametersNoCopy()
+ {
+ // @History - Logic ported from RTM
+
+ // No need to lock because we don't guarantee the uniqueness of ParameterInfo objects
+ if (m_parameters == null)
+ {
+ int numParams = 0;
+ ParameterInfo[] methParams = null;
+
+ // First try to get the Get method.
+ MethodInfo m = GetGetMethod(true);
+ if (m != null)
+ {
+ // There is a Get method so use it.
+ methParams = m.GetParametersNoCopy();
+ numParams = methParams.Length;
+ }
+ else
+ {
+ // If there is no Get method then use the Set method.
+ m = GetSetMethod(true);
+
+ if (m != null)
+ {
+ methParams = m.GetParametersNoCopy();
+ numParams = methParams.Length - 1;
+ }
+ }
+
+ // Now copy over the parameter info's and change their
+ // owning member info to the current property info.
+
+ ParameterInfo[] propParams = new ParameterInfo[numParams];
+
+ for (int i = 0; i < numParams; i++)
+ propParams[i] = new RuntimeParameterInfo((RuntimeParameterInfo)methParams[i], this);
+
+ m_parameters = propParams;
+ }
+
+ return m_parameters;
+ }
+
+ public override PropertyAttributes Attributes
+ {
+ get
+ {
+ return m_flags;
+ }
+ }
+
+ public override bool CanRead
+ {
+ get
+ {
+ return m_getterMethod != null;
+ }
+ }
+
+ public override bool CanWrite
+ {
+ get
+ {
+ return m_setterMethod != null;
+ }
+ }
+ #endregion
+
+ #region Dynamic
+ [DebuggerStepThroughAttribute]
+ [Diagnostics.DebuggerHidden]
+ public override Object GetValue(Object obj, Object[] index)
+ {
+ return GetValue(obj, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static,
+ null, index, null);
+ }
+
+ [DebuggerStepThroughAttribute]
+ [Diagnostics.DebuggerHidden]
+ public override Object GetValue(Object obj, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture)
+ {
+ MethodInfo m = GetGetMethod(true);
+ if (m == null)
+ throw new ArgumentException(System.Environment.GetResourceString("Arg_GetMethNotFnd"));
+ return m.Invoke(obj, invokeAttr, binder, index, null);
+ }
+
+ [DebuggerStepThroughAttribute]
+ [Diagnostics.DebuggerHidden]
+ public override void SetValue(Object obj, Object value, Object[] index)
+ {
+ SetValue(obj,
+ value,
+ BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static,
+ null,
+ index,
+ null);
+ }
+
+ [DebuggerStepThroughAttribute]
+ [Diagnostics.DebuggerHidden]
+ public override void SetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture)
+ {
+ MethodInfo m = GetSetMethod(true);
+
+ if (m == null)
+ throw new ArgumentException(System.Environment.GetResourceString("Arg_SetMethNotFnd"));
+
+ Object[] args = null;
+
+ if (index != null)
+ {
+ args = new Object[index.Length + 1];
+
+ for (int i = 0; i < index.Length; i++)
+ args[i] = index[i];
+
+ args[index.Length] = value;
+ }
+ else
+ {
+ args = new Object[1];
+ args[0] = value;
+ }
+
+ m.Invoke(obj, invokeAttr, binder, args, culture);
+ }
+ #endregion
+
+ #endregion
+
+ #region ISerializable Implementation
+ public void GetObjectData(SerializationInfo info, StreamingContext context)
+ {
+ if (info == null)
+ throw new ArgumentNullException(nameof(info));
+ Contract.EndContractBlock();
+
+ MemberInfoSerializationHolder.GetSerializationInfo(
+ info,
+ Name,
+ ReflectedTypeInternal,
+ ToString(),
+ SerializationToString(),
+ MemberTypes.Property,
+ null);
+ }
+
+ internal string SerializationToString()
+ {
+ return FormatNameAndSig(true);
+ }
+ #endregion
+ }
+}