From 6570ae490e8aa0bab80b82447b1c96e186b24e2b Mon Sep 17 00:00:00 2001 From: Atsushi Kanamori Date: Sat, 18 Mar 2017 04:37:06 -0700 Subject: [PATCH] Move ParameterInfo.cs and Assembly.cs to shared partition. (dotnet/coreclr#10270) * Clone the files. * Split the members between shared and nonshared files. * Replaced ParameterInfo with CoreRt text member by member. * Replaced Module.cs with CoreRt text member by member. * Remove dead filter code. * Replaced Assembly.cs with CoreRt text member by member. * Transplanted CoreRt files. This is a reordering without any other changes. Verified by sorting the old and new files and diffing. * Migrated ParameterInfo.cs and Assembly.cs to shared directory. Leaving Module.cs in place for now as one line is going to have to change over in CoreRt land. ModuleHandle ModuleHandle => new ModuleHandle(this); * Cleanup. * Move the final internal methods to RuntimeParameterInfo. Commit migrated from https://github.com/dotnet/coreclr/commit/487a39c2bf0ce6cdf38a6b0ec49a7e210ef8c5c5 --- .../src/mscorlib/System.Private.CoreLib.csproj | 5 +- .../shared/System.Private.CoreLib.Shared.projitems | 2 + .../mscorlib/shared/System/Reflection/Assembly.cs | 200 ++++++ .../shared/System/Reflection/ParameterInfo.cs | 110 +++ src/coreclr/src/mscorlib/src/SR.cs | 18 + .../src/System/Reflection/Assembly.CoreCLR.cs | 211 ++++++ .../src/mscorlib/src/System/Reflection/Assembly.cs | 738 --------------------- .../src/System/Reflection/Emit/DynamicMethod.cs | 8 +- .../src/System/Reflection/Module.CoreCLR.cs | 18 + .../src/mscorlib/src/System/Reflection/Module.cs | 507 +++----------- .../src/System/Reflection/ParameterInfo.cs | 224 ------- .../src/System/Reflection/RuntimeParameterInfo.cs | 12 + .../mscorlib/src/System/Reflection/__Filters.cs | 71 -- 13 files changed, 672 insertions(+), 1452 deletions(-) create mode 100644 src/coreclr/src/mscorlib/shared/System/Reflection/Assembly.cs create mode 100644 src/coreclr/src/mscorlib/shared/System/Reflection/ParameterInfo.cs create mode 100644 src/coreclr/src/mscorlib/src/System/Reflection/Assembly.CoreCLR.cs delete mode 100644 src/coreclr/src/mscorlib/src/System/Reflection/Assembly.cs create mode 100644 src/coreclr/src/mscorlib/src/System/Reflection/Module.CoreCLR.cs delete mode 100644 src/coreclr/src/mscorlib/src/System/Reflection/ParameterInfo.cs delete mode 100644 src/coreclr/src/mscorlib/src/System/Reflection/__Filters.cs diff --git a/src/coreclr/src/mscorlib/System.Private.CoreLib.csproj b/src/coreclr/src/mscorlib/System.Private.CoreLib.csproj index 7ee6c0d..2c34c04 100644 --- a/src/coreclr/src/mscorlib/System.Private.CoreLib.csproj +++ b/src/coreclr/src/mscorlib/System.Private.CoreLib.csproj @@ -434,9 +434,8 @@ - - + @@ -476,10 +475,10 @@ + - diff --git a/src/coreclr/src/mscorlib/shared/System.Private.CoreLib.Shared.projitems b/src/coreclr/src/mscorlib/shared/System.Private.CoreLib.Shared.projitems index b56dc38..b874c04 100644 --- a/src/coreclr/src/mscorlib/shared/System.Private.CoreLib.Shared.projitems +++ b/src/coreclr/src/mscorlib/shared/System.Private.CoreLib.Shared.projitems @@ -155,6 +155,7 @@ + @@ -162,6 +163,7 @@ + diff --git a/src/coreclr/src/mscorlib/shared/System/Reflection/Assembly.cs b/src/coreclr/src/mscorlib/shared/System/Reflection/Assembly.cs new file mode 100644 index 0000000..d35ffc7 --- /dev/null +++ b/src/coreclr/src/mscorlib/shared/System/Reflection/Assembly.cs @@ -0,0 +1,200 @@ +// 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.IO; +using System.Globalization; +using System.Collections.Generic; +using System.Configuration.Assemblies; +using System.Runtime.Serialization; +using System.Security; + +namespace System.Reflection +{ + public abstract partial class Assembly : ICustomAttributeProvider, ISerializable + { + protected Assembly() { } + + public virtual IEnumerable DefinedTypes + { + get + { + Type[] types = GetTypes(); + TypeInfo[] typeinfos = new TypeInfo[types.Length]; + for (int i = 0; i < types.Length; i++) + { + TypeInfo typeinfo = types[i].GetTypeInfo(); + if (typeinfo == null) + throw new NotSupportedException(SR.Format(SR.NotSupported_NoTypeInfo, types[i].FullName)); + + typeinfos[i] = typeinfo; + } + return typeinfos; + } + } + + public virtual Type[] GetTypes() + { + Module[] m = GetModules(false); + + int finalLength = 0; + Type[][] moduleTypes = new Type[m.Length][]; + + for (int i = 0; i < moduleTypes.Length; i++) + { + moduleTypes[i] = m[i].GetTypes(); + finalLength += moduleTypes[i].Length; + } + + int current = 0; + Type[] ret = new Type[finalLength]; + for (int i = 0; i < moduleTypes.Length; i++) + { + int length = moduleTypes[i].Length; + Array.Copy(moduleTypes[i], 0, ret, current, length); + current += length; + } + + return ret; + } + + public virtual IEnumerable ExportedTypes => GetExportedTypes(); + public virtual Type[] GetExportedTypes() { throw NotImplemented.ByDesign; } + + public virtual string CodeBase { get { throw NotImplemented.ByDesign; } } + public virtual MethodInfo EntryPoint { get { throw NotImplemented.ByDesign; } } + public virtual string FullName { get { throw NotImplemented.ByDesign; } } + public virtual string ImageRuntimeVersion { get { throw NotImplemented.ByDesign; } } + public virtual bool IsDynamic => false; + public virtual string Location { get { throw NotImplemented.ByDesign; } } + public virtual bool ReflectionOnly { get { throw NotImplemented.ByDesign; } } + + public virtual ManifestResourceInfo GetManifestResourceInfo(string resourceName) { throw NotImplemented.ByDesign; } + public virtual string[] GetManifestResourceNames() { throw NotImplemented.ByDesign; } + public virtual Stream GetManifestResourceStream(string name) { throw NotImplemented.ByDesign; } + public virtual Stream GetManifestResourceStream(Type type, string name) { throw NotImplemented.ByDesign; } + + public bool IsFullyTrusted => true; + + public virtual AssemblyName GetName() => GetName(copiedName: false); + public virtual AssemblyName GetName(bool copiedName) { throw NotImplemented.ByDesign; } + + public virtual Type GetType(string name) => GetType(name, throwOnError: false, ignoreCase: false); + public virtual Type GetType(string name, bool throwOnError) => GetType(name, throwOnError: throwOnError, ignoreCase: false); + public virtual Type GetType(string name, bool throwOnError, bool ignoreCase) { throw NotImplemented.ByDesign; } + + public virtual bool IsDefined(Type attributeType, bool inherit) { throw NotImplemented.ByDesign; } + + public virtual IEnumerable CustomAttributes => GetCustomAttributesData(); + public virtual IList GetCustomAttributesData() { throw NotImplemented.ByDesign; } + + public virtual object[] GetCustomAttributes(bool inherit) { throw NotImplemented.ByDesign; } + public virtual object[] GetCustomAttributes(Type attributeType, bool inherit) { throw NotImplemented.ByDesign; } + + public virtual string EscapedCodeBase => AssemblyName.EscapeCodeBase(CodeBase); + + public object CreateInstance(string typeName) => CreateInstance(typeName, false, BindingFlags.Public | BindingFlags.Instance, binder: null, args: null, culture: null, activationAttributes: null); + public object CreateInstance(string typeName, bool ignoreCase) => CreateInstance(typeName, ignoreCase, BindingFlags.Public | BindingFlags.Instance, binder: null, args: null, culture: null, activationAttributes: null); + public virtual object CreateInstance(string typeName, bool ignoreCase, BindingFlags bindingAttr, Binder binder, object[] args, CultureInfo culture, object[] activationAttributes) + { + Type t = GetType(typeName, throwOnError: false, ignoreCase: ignoreCase); + if (t == null) + return null; + + return Activator.CreateInstance(t, bindingAttr, binder, args, culture, activationAttributes); + } + + public virtual event ModuleResolveEventHandler ModuleResolve { add { throw NotImplemented.ByDesign; } remove { throw NotImplemented.ByDesign; } } + + public virtual Module ManifestModule { get { throw NotImplemented.ByDesign; } } + public virtual Module GetModule(string name) { throw NotImplemented.ByDesign; } + + public Module[] GetModules() => GetModules(getResourceModules: false); + public virtual Module[] GetModules(bool getResourceModules) { throw NotImplemented.ByDesign; } + + public virtual IEnumerable Modules => GetLoadedModules(getResourceModules: true); + public Module[] GetLoadedModules() => GetLoadedModules(getResourceModules: false); + public virtual Module[] GetLoadedModules(bool getResourceModules) { throw NotImplemented.ByDesign; } + + public virtual AssemblyName[] GetReferencedAssemblies() { throw NotImplemented.ByDesign; } + + public virtual Assembly GetSatelliteAssembly(CultureInfo culture) { throw NotImplemented.ByDesign; } + public virtual Assembly GetSatelliteAssembly(CultureInfo culture, Version version) { throw NotImplemented.ByDesign; } + + public virtual FileStream GetFile(string name) { throw NotImplemented.ByDesign; } + public virtual FileStream[] GetFiles() => GetFiles(getResourceModules: false); + public virtual FileStream[] GetFiles(bool getResourceModules) { throw NotImplemented.ByDesign; } + + public virtual void GetObjectData(SerializationInfo info, StreamingContext context) { throw NotImplemented.ByDesign; } + + public override string ToString() + { + string displayName = FullName; + if (displayName == null) + return base.ToString(); + else + return displayName; + } + + /* + Returns true if the assembly was loaded from the global assembly cache. + */ + public virtual bool GlobalAssemblyCache { get { throw NotImplemented.ByDesign; } } + public virtual Int64 HostContext { get { throw NotImplemented.ByDesign; } } + + public override bool Equals(object o) => base.Equals(o); + public override int GetHashCode() => base.GetHashCode(); + + public static bool operator ==(Assembly left, Assembly right) + { + if (object.ReferenceEquals(left, right)) + return true; + + if ((object)left == null || (object)right == null) + return false; + + return left.Equals(right); + } + + public static bool operator !=(Assembly left, Assembly right) + { + return !(left == right); + } + + public static string CreateQualifiedName(string assemblyName, string typeName) => typeName + ", " + assemblyName; + + public static Assembly GetAssembly(Type type) + { + if (type == null) + throw new ArgumentNullException(nameof(type)); + + Module m = type.Module; + if (m == null) + return null; + else + return m.Assembly; + } + + public static Assembly Load(byte[] rawAssembly) => Load(rawAssembly, rawSymbolStore: null); + + [Obsolete("This method has been deprecated. Please use Assembly.Load() instead. http://go.microsoft.com/fwlink/?linkid=14202")] + public static Assembly LoadWithPartialName(string partialName) + { + if (partialName == null) + throw new ArgumentNullException(nameof(partialName)); + + return Load(partialName); + } + + public static Assembly UnsafeLoadFrom(string assemblyFile) => LoadFrom(assemblyFile); + + public Module LoadModule(string moduleName, byte[] rawModule) => LoadModule(moduleName, rawModule, null); + public virtual Module LoadModule(string moduleName, byte[] rawModule, byte[] rawSymbolStore) { throw NotImplemented.ByDesign; } + + public static Assembly ReflectionOnlyLoad(byte[] rawAssembly) { throw new PlatformNotSupportedException(SR.PlatformNotSupported_ReflectionOnly); } + public static Assembly ReflectionOnlyLoad(string assemblyString) { throw new PlatformNotSupportedException(SR.PlatformNotSupported_ReflectionOnly); } + public static Assembly ReflectionOnlyLoadFrom(string assemblyFile) { throw new PlatformNotSupportedException(SR.PlatformNotSupported_ReflectionOnly); } + + public virtual SecurityRuleSet SecurityRuleSet => SecurityRuleSet.None; + } +} diff --git a/src/coreclr/src/mscorlib/shared/System/Reflection/ParameterInfo.cs b/src/coreclr/src/mscorlib/shared/System/Reflection/ParameterInfo.cs new file mode 100644 index 0000000..94bfffa --- /dev/null +++ b/src/coreclr/src/mscorlib/shared/System/Reflection/ParameterInfo.cs @@ -0,0 +1,110 @@ +// 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.Runtime.Serialization; + +namespace System.Reflection +{ + public class ParameterInfo : ICustomAttributeProvider, IObjectReference + { + protected ParameterInfo() { } + + public virtual ParameterAttributes Attributes => AttrsImpl; + public virtual MemberInfo Member => MemberImpl; + public virtual string Name => NameImpl; + public virtual Type ParameterType => ClassImpl; + public virtual int Position => PositionImpl; + + public bool IsIn => (Attributes & ParameterAttributes.In) != 0; + public bool IsLcid => (Attributes & ParameterAttributes.Lcid) != 0; + public bool IsOptional => (Attributes & ParameterAttributes.Optional) != 0; + public bool IsOut => (Attributes & ParameterAttributes.Out) != 0; + public bool IsRetval => (Attributes & ParameterAttributes.Retval) != 0; + + public virtual object DefaultValue { get { throw NotImplemented.ByDesign; } } + public virtual object RawDefaultValue { get { throw NotImplemented.ByDesign; } } + public virtual bool HasDefaultValue { get { throw NotImplemented.ByDesign; } } + + public virtual bool IsDefined(Type attributeType, bool inherit) + { + if (attributeType == null) + throw new ArgumentNullException(nameof(attributeType)); + + return false; + } + + public virtual IEnumerable CustomAttributes => GetCustomAttributesData(); + public virtual IList GetCustomAttributesData() { throw NotImplemented.ByDesign; } + + public virtual object[] GetCustomAttributes(bool inherit) => Array.Empty(); + public virtual object[] GetCustomAttributes(Type attributeType, bool inherit) + { + if (attributeType == null) + throw new ArgumentNullException(nameof(attributeType)); + + return Array.Empty(); + } + + public virtual Type[] GetOptionalCustomModifiers() => Array.Empty(); + public virtual Type[] GetRequiredCustomModifiers() => Array.Empty(); + + public virtual int MetadataToken => MetadataToken_ParamDef; + + public object GetRealObject(StreamingContext context) + { + // Once all the serializable fields have come in we can set up the real + // instance based on just two of them (MemberImpl and PositionImpl). + + if (MemberImpl == null) + throw new SerializationException(SR.Serialization_InsufficientState); + + ParameterInfo[] args = null; + + switch (MemberImpl.MemberType) + { + case MemberTypes.Constructor: + case MemberTypes.Method: + if (PositionImpl == -1) + { + if (MemberImpl.MemberType == MemberTypes.Method) + return ((MethodInfo)MemberImpl).ReturnParameter; + else + throw new SerializationException(SR.Serialization_BadParameterInfo); + } + else + { + args = ((MethodBase)MemberImpl).GetParametersNoCopy(); + + if (args != null && PositionImpl < args.Length) + return args[PositionImpl]; + else + throw new SerializationException(SR.Serialization_BadParameterInfo); + } + + case MemberTypes.Property: + args = ((PropertyInfo)MemberImpl).GetIndexParameters(); + + if (args != null && PositionImpl > -1 && PositionImpl < args.Length) + return args[PositionImpl]; + else + throw new SerializationException(SR.Serialization_BadParameterInfo); + + default: + throw new SerializationException(SR.Serialization_NoParameterInfo); + } + } + + public override string ToString() => ParameterType.FormatTypeName() + " " + Name; + + protected ParameterAttributes AttrsImpl; + protected Type ClassImpl; + protected object DefaultValueImpl; + protected MemberInfo MemberImpl; + protected string NameImpl; + protected int PositionImpl; + + private const int MetadataToken_ParamDef = 0x08000000; + } +} diff --git a/src/coreclr/src/mscorlib/src/SR.cs b/src/coreclr/src/mscorlib/src/SR.cs index e013a56..c11743a 100644 --- a/src/coreclr/src/mscorlib/src/SR.cs +++ b/src/coreclr/src/mscorlib/src/SR.cs @@ -957,4 +957,22 @@ internal static class SR internal static string NotSupported_AbstractNonCLS => Environment.GetResourceString("NotSupported_AbstractNonCLS"); + + internal static string Serialization_InsufficientState => + Environment.GetResourceString("Serialization_InsufficientState"); + + internal static string Serialization_BadParameterInfo => + Environment.GetResourceString("Serialization_BadParameterInfo"); + + internal static string Serialization_NoParameterInfo => + Environment.GetResourceString("Serialization_NoParameterInfo"); + + internal static string InvalidFilterCriteriaException_CritString => + Environment.GetResourceString("InvalidFilterCriteriaException_CritString"); + + internal static string NotSupported_NoTypeInfo => + Environment.GetResourceString("NotSupported_NoTypeInfo"); + + internal static string PlatformNotSupported_ReflectionOnly => + Environment.GetResourceString("PlatformNotSupported_ReflectionOnly"); } diff --git a/src/coreclr/src/mscorlib/src/System/Reflection/Assembly.CoreCLR.cs b/src/coreclr/src/mscorlib/src/System/Reflection/Assembly.CoreCLR.cs new file mode 100644 index 0000000..86f7f42 --- /dev/null +++ b/src/coreclr/src/mscorlib/src/System/Reflection/Assembly.CoreCLR.cs @@ -0,0 +1,211 @@ +// 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.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 +{ + public abstract partial class Assembly : ICustomAttributeProvider, ISerializable + { + public static Assembly LoadFrom(String assemblyFile) + { + if (assemblyFile == null) + throw new ArgumentNullException(nameof(assemblyFile)); + string fullPath = Path.GetFullPath(assemblyFile); + return AssemblyLoadContext.Default.LoadFromAssemblyPath(fullPath); + } + + // Evidence is protected in Assembly.Load() + [Obsolete("This method is obsolete and will be removed in a future release of the .NET Framework. Please use an overload of LoadFrom which does not take an Evidence parameter. See http://go.microsoft.com/fwlink/?LinkID=155570 for more information.")] + [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod + internal static Assembly LoadFrom(String assemblyFile, + Evidence securityEvidence) + { + Contract.Ensures(Contract.Result() != null); + + StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; + + return RuntimeAssembly.InternalLoadFrom( + assemblyFile, + securityEvidence, + null, // hashValue + AssemblyHashAlgorithm.None, + false,// forIntrospection); + ref stackMark); + } + + [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod + public static Assembly LoadFrom(String assemblyFile, + byte[] hashValue, + AssemblyHashAlgorithm hashAlgorithm) + { + throw new NotSupportedException(Environment.GetResourceString("NotSupported_AssemblyLoadFromHash")); + } + + // Locate an assembly by the long form of the assembly name. + // eg. "Toolbox.dll, version=1.1.10.1220, locale=en, publickey=1234567890123456789012345678901234567890" + [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod + public static Assembly Load(String assemblyString) + { + Contract.Ensures(Contract.Result() != null); + Contract.Ensures(!Contract.Result().ReflectionOnly); + + StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; + return RuntimeAssembly.InternalLoad(assemblyString, null, ref stackMark, false /*forIntrospection*/); + } + + // Returns type from the assembly while keeping compatibility with Assembly.Load(assemblyString).GetType(typeName) for managed types. + // Calls Type.GetType for WinRT types. + // Note: Type.GetType fails for assembly names that start with weird characters like '['. By calling it for managed types we would + // break AppCompat. + [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod + internal static Type GetType_Compat(String assemblyString, String typeName) + { + // Normally we would get the stackMark only in public APIs. This is internal API, but it is AppCompat replacement of public API + // call Assembly.Load(assemblyString).GetType(typeName), therefore we take the stackMark here as well, to be fully compatible with + // the call sequence. + StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; + + RuntimeAssembly assembly; + AssemblyName assemblyName = RuntimeAssembly.CreateAssemblyName( + assemblyString, + false /*forIntrospection*/, + out assembly); + + if (assembly == null) + { + if (assemblyName.ContentType == AssemblyContentType.WindowsRuntime) + { + return Type.GetType(typeName + ", " + assemblyString, true /*throwOnError*/, false /*ignoreCase*/); + } + + assembly = RuntimeAssembly.InternalLoadAssemblyName( + assemblyName, null, null, ref stackMark, + true /*thrownOnFileNotFound*/, false /*forIntrospection*/); + } + return assembly.GetType(typeName, true /*throwOnError*/, false /*ignoreCase*/); + } + + // Locate an assembly by its name. The name can be strong or + // weak. The assembly is loaded into the domain of the caller. + [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod + public static Assembly Load(AssemblyName assemblyRef) + { + Contract.Ensures(Contract.Result() != null); + Contract.Ensures(!Contract.Result().ReflectionOnly); + + if (assemblyRef != null && assemblyRef.CodeBase != null) + { + throw new NotSupportedException(Environment.GetResourceString("NotSupported_AssemblyLoadCodeBase")); + } + + StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; + return RuntimeAssembly.InternalLoadAssemblyName(assemblyRef, null, null, ref stackMark, true /*thrownOnFileNotFound*/, false /*forIntrospection*/); + } + + // Locate an assembly by its name. The name can be strong or + // weak. The assembly is loaded into the domain of the caller. + [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod + internal static Assembly Load(AssemblyName assemblyRef, IntPtr ptrLoadContextBinder) + { + Contract.Ensures(Contract.Result() != null); + Contract.Ensures(!Contract.Result().ReflectionOnly); + + if (assemblyRef != null && assemblyRef.CodeBase != null) + { + throw new NotSupportedException(Environment.GetResourceString("NotSupported_AssemblyLoadCodeBase")); + } + + StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; + return RuntimeAssembly.InternalLoadAssemblyName(assemblyRef, null, null, ref stackMark, true /*thrownOnFileNotFound*/, false /*forIntrospection*/, ptrLoadContextBinder); + } + + // Loads the assembly with a COFF based IMAGE containing + // an emitted assembly. The assembly is loaded into the domain + // of the caller. The second parameter is the raw bytes + // representing the symbol store that matches the assembly. + [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod + public static Assembly Load(byte[] rawAssembly, + byte[] rawSymbolStore) + { + Contract.Ensures(Contract.Result() != null); + Contract.Ensures(!Contract.Result().ReflectionOnly); + + AppDomain.CheckLoadByteArraySupported(); + + if (rawAssembly == null) + throw new ArgumentNullException(nameof(rawAssembly)); + AssemblyLoadContext alc = new IndividualAssemblyLoadContext(); + MemoryStream assemblyStream = new MemoryStream(rawAssembly); + MemoryStream symbolStream = (rawSymbolStore != null) ? new MemoryStream(rawSymbolStore) : null; + return alc.LoadFromStream(assemblyStream, symbolStream); + } + + private static Dictionary s_loadfile = new Dictionary(); + + public static Assembly LoadFile(String path) + { + Contract.Ensures(Contract.Result() != null); + Contract.Ensures(!Contract.Result().ReflectionOnly); + + AppDomain.CheckLoadFileSupported(); + + Assembly result = null; + if (path == null) + throw new ArgumentNullException(nameof(path)); + + if (PathInternal.IsPartiallyQualified(path)) + { + throw new ArgumentException(Environment.GetResourceString("Argument_AbsolutePathRequired"), nameof(path)); + } + + string normalizedPath = Path.GetFullPath(path); + + lock (s_loadfile) + { + if (s_loadfile.TryGetValue(normalizedPath, out result)) + return result; + AssemblyLoadContext alc = new IndividualAssemblyLoadContext(); + result = alc.LoadFromAssemblyPath(normalizedPath); + s_loadfile.Add(normalizedPath, result); + } + return result; + } + + /* + * Get the assembly that the current code is running from. + */ + [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod + public static Assembly GetExecutingAssembly() + { + StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; + return RuntimeAssembly.GetExecutingAssembly(ref stackMark); + } + + [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod + public static Assembly GetCallingAssembly() + { + // LookForMyCallersCaller is not guarantee to return the correct stack frame + // because of inlining, tail calls, etc. As a result GetCallingAssembly is not + // ganranteed to return the correct result. We should document it as such. + StackCrawlMark stackMark = StackCrawlMark.LookForMyCallersCaller; + return RuntimeAssembly.GetExecutingAssembly(ref stackMark); + } + + public static Assembly GetEntryAssembly() + { + AppDomainManager domainManager = AppDomain.CurrentDomain.DomainManager; + if (domainManager == null) + domainManager = new AppDomainManager(); + return domainManager.EntryAssembly; + } + } +} diff --git a/src/coreclr/src/mscorlib/src/System/Reflection/Assembly.cs b/src/coreclr/src/mscorlib/src/System/Reflection/Assembly.cs deleted file mode 100644 index 86aa373..0000000 --- a/src/coreclr/src/mscorlib/src/System/Reflection/Assembly.cs +++ /dev/null @@ -1,738 +0,0 @@ -// 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 System.Configuration.Assemblies; -using StackCrawlMark = System.Threading.StackCrawlMark; -using System.Runtime.Serialization; -using System.Diagnostics.Contracts; -using System.Runtime.Loader; - -namespace System.Reflection -{ - [Serializable] - public abstract class Assembly : ICustomAttributeProvider, ISerializable - { - protected Assembly() { } - - #region public static methods - - public static String CreateQualifiedName(String assemblyName, String typeName) - { - return typeName + ", " + assemblyName; - } - - public static Assembly GetAssembly(Type type) - { - if (type == null) - throw new ArgumentNullException(nameof(type)); - Contract.EndContractBlock(); - - Module m = type.Module; - if (m == null) - return null; - else - return m.Assembly; - } - - public static bool operator ==(Assembly left, Assembly right) - { - if (ReferenceEquals(left, right)) - return true; - - if ((object)left == null || (object)right == null || - left is RuntimeAssembly || right is RuntimeAssembly) - { - return false; - } - return left.Equals(right); - } - - public static bool operator !=(Assembly left, Assembly right) - { - return !(left == right); - } - - public override bool Equals(object o) - { - return base.Equals(o); - } - - public override int GetHashCode() - { - return base.GetHashCode(); - } - - public static Assembly LoadFrom(String assemblyFile) - { - if (assemblyFile == null) - throw new ArgumentNullException(nameof(assemblyFile)); - string fullPath = Path.GetFullPath(assemblyFile); - return AssemblyLoadContext.Default.LoadFromAssemblyPath(fullPath); - } - - // Locate an assembly for reflection by the name of the file containing the manifest. - [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod - public static Assembly ReflectionOnlyLoadFrom(String assemblyFile) - { - if (assemblyFile == null) - throw new ArgumentNullException(nameof(assemblyFile)); - if (assemblyFile.Length == 0) - throw new ArgumentException(Environment.GetResourceString("Format_StringZeroLength")); - throw new NotSupportedException(Environment.GetResourceString("NotSupported_ReflectionOnlyLoad")); - } - - // Evidence is protected in Assembly.Load() - [Obsolete("This method is obsolete and will be removed in a future release of the .NET Framework. Please use an overload of LoadFrom which does not take an Evidence parameter. See http://go.microsoft.com/fwlink/?LinkID=155570 for more information.")] - [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod - internal static Assembly LoadFrom(String assemblyFile, - Evidence securityEvidence) - { - Contract.Ensures(Contract.Result() != null); - - StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; - - return RuntimeAssembly.InternalLoadFrom( - assemblyFile, - securityEvidence, - null, // hashValue - AssemblyHashAlgorithm.None, - false,// forIntrospection); - ref stackMark); - } - - [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod - public static Assembly LoadFrom(String assemblyFile, - byte[] hashValue, - AssemblyHashAlgorithm hashAlgorithm) - { - throw new NotSupportedException(Environment.GetResourceString("NotSupported_AssemblyLoadFromHash")); - } - - public static Assembly UnsafeLoadFrom(string assemblyFile) - { - return LoadFrom(assemblyFile); - } - - // Locate an assembly by the long form of the assembly name. - // eg. "Toolbox.dll, version=1.1.10.1220, locale=en, publickey=1234567890123456789012345678901234567890" - [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod - public static Assembly Load(String assemblyString) - { - Contract.Ensures(Contract.Result() != null); - Contract.Ensures(!Contract.Result().ReflectionOnly); - - StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; - return RuntimeAssembly.InternalLoad(assemblyString, null, ref stackMark, false /*forIntrospection*/); - } - - // Returns type from the assembly while keeping compatibility with Assembly.Load(assemblyString).GetType(typeName) for managed types. - // Calls Type.GetType for WinRT types. - // Note: Type.GetType fails for assembly names that start with weird characters like '['. By calling it for managed types we would - // break AppCompat. - [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod - internal static Type GetType_Compat(String assemblyString, String typeName) - { - // Normally we would get the stackMark only in public APIs. This is internal API, but it is AppCompat replacement of public API - // call Assembly.Load(assemblyString).GetType(typeName), therefore we take the stackMark here as well, to be fully compatible with - // the call sequence. - StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; - - RuntimeAssembly assembly; - AssemblyName assemblyName = RuntimeAssembly.CreateAssemblyName( - assemblyString, - false /*forIntrospection*/, - out assembly); - - if (assembly == null) - { - if (assemblyName.ContentType == AssemblyContentType.WindowsRuntime) - { - return Type.GetType(typeName + ", " + assemblyString, true /*throwOnError*/, false /*ignoreCase*/); - } - - assembly = RuntimeAssembly.InternalLoadAssemblyName( - assemblyName, null, null, ref stackMark, - true /*thrownOnFileNotFound*/, false /*forIntrospection*/); - } - return assembly.GetType(typeName, true /*throwOnError*/, false /*ignoreCase*/); - } - - // Locate an assembly for reflection by the long form of the assembly name. - // eg. "Toolbox.dll, version=1.1.10.1220, locale=en, publickey=1234567890123456789012345678901234567890" - // - [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod - public static Assembly ReflectionOnlyLoad(String assemblyString) - { - if (assemblyString == null) - throw new ArgumentNullException(nameof(assemblyString)); - if (assemblyString.Length == 0) - throw new ArgumentException(Environment.GetResourceString("Format_StringZeroLength")); - throw new NotSupportedException(Environment.GetResourceString("NotSupported_ReflectionOnlyLoad")); - } - - // Locate an assembly by its name. The name can be strong or - // weak. The assembly is loaded into the domain of the caller. - [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod - public static Assembly Load(AssemblyName assemblyRef) - { - Contract.Ensures(Contract.Result() != null); - Contract.Ensures(!Contract.Result().ReflectionOnly); - - if (assemblyRef != null && assemblyRef.CodeBase != null) - { - throw new NotSupportedException(Environment.GetResourceString("NotSupported_AssemblyLoadCodeBase")); - } - - StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; - return RuntimeAssembly.InternalLoadAssemblyName(assemblyRef, null, null, ref stackMark, true /*thrownOnFileNotFound*/, false /*forIntrospection*/); - } - - // Locate an assembly by its name. The name can be strong or - // weak. The assembly is loaded into the domain of the caller. - [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod - internal static Assembly Load(AssemblyName assemblyRef, IntPtr ptrLoadContextBinder) - { - Contract.Ensures(Contract.Result() != null); - Contract.Ensures(!Contract.Result().ReflectionOnly); - - if (assemblyRef != null && assemblyRef.CodeBase != null) - { - throw new NotSupportedException(Environment.GetResourceString("NotSupported_AssemblyLoadCodeBase")); - } - - StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; - return RuntimeAssembly.InternalLoadAssemblyName(assemblyRef, null, null, ref stackMark, true /*thrownOnFileNotFound*/, false /*forIntrospection*/, ptrLoadContextBinder); - } - - [Obsolete("This method has been deprecated. Please use Assembly.Load() instead. http://go.microsoft.com/fwlink/?linkid=14202")] - public static Assembly LoadWithPartialName(String partialName) - { - if (partialName == null) - throw new ArgumentNullException(nameof(partialName)); - return Load(partialName); - } - - // Loads the assembly with a COFF based IMAGE containing - // an emitted assembly. The assembly is loaded into the domain - // of the caller. - [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod - public static Assembly Load(byte[] rawAssembly) - { - Contract.Ensures(Contract.Result() != null); - Contract.Ensures(!Contract.Result().ReflectionOnly); - - AppDomain.CheckLoadByteArraySupported(); - - return Load(rawAssembly, null); - } - - // Loads the assembly for reflection with a COFF based IMAGE containing - // an emitted assembly. The assembly is loaded into the domain - // of the caller. - [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod - public static Assembly ReflectionOnlyLoad(byte[] rawAssembly) - { - if (rawAssembly == null) - throw new ArgumentNullException(nameof(rawAssembly)); - throw new NotSupportedException(Environment.GetResourceString("NotSupported_ReflectionOnlyLoad")); - } - - // Loads the assembly with a COFF based IMAGE containing - // an emitted assembly. The assembly is loaded into the domain - // of the caller. The second parameter is the raw bytes - // representing the symbol store that matches the assembly. - [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod - public static Assembly Load(byte[] rawAssembly, - byte[] rawSymbolStore) - { - Contract.Ensures(Contract.Result() != null); - Contract.Ensures(!Contract.Result().ReflectionOnly); - - AppDomain.CheckLoadByteArraySupported(); - - if (rawAssembly == null) - throw new ArgumentNullException(nameof(rawAssembly)); - AssemblyLoadContext alc = new IndividualAssemblyLoadContext(); - MemoryStream assemblyStream = new MemoryStream(rawAssembly); - MemoryStream symbolStream = (rawSymbolStore != null) ? new MemoryStream(rawSymbolStore) : null; - return alc.LoadFromStream(assemblyStream, symbolStream); - } - - private static Dictionary s_loadfile = new Dictionary(); - - public static Assembly LoadFile(String path) - { - Contract.Ensures(Contract.Result() != null); - Contract.Ensures(!Contract.Result().ReflectionOnly); - - AppDomain.CheckLoadFileSupported(); - - Assembly result = null; - if (path == null) - throw new ArgumentNullException(nameof(path)); - - if (PathInternal.IsPartiallyQualified(path)) - { - throw new ArgumentException(Environment.GetResourceString("Argument_AbsolutePathRequired"), nameof(path)); - } - - string normalizedPath = Path.GetFullPath(path); - - lock (s_loadfile) - { - if (s_loadfile.TryGetValue(normalizedPath, out result)) - return result; - AssemblyLoadContext alc = new IndividualAssemblyLoadContext(); - result = alc.LoadFromAssemblyPath(normalizedPath); - s_loadfile.Add(normalizedPath, result); - } - return result; - } - - /* - * Get the assembly that the current code is running from. - */ - [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod - public static Assembly GetExecutingAssembly() - { - StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; - return RuntimeAssembly.GetExecutingAssembly(ref stackMark); - } - - [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod - public static Assembly GetCallingAssembly() - { - // LookForMyCallersCaller is not guarantee to return the correct stack frame - // because of inlining, tail calls, etc. As a result GetCallingAssembly is not - // ganranteed to return the correct result. We should document it as such. - StackCrawlMark stackMark = StackCrawlMark.LookForMyCallersCaller; - return RuntimeAssembly.GetExecutingAssembly(ref stackMark); - } - - public static Assembly GetEntryAssembly() - { - AppDomainManager domainManager = AppDomain.CurrentDomain.DomainManager; - if (domainManager == null) - domainManager = new AppDomainManager(); - return domainManager.EntryAssembly; - } - - #endregion // public static methods - - #region public methods - public virtual event ModuleResolveEventHandler ModuleResolve - { - add - { - throw new NotImplementedException(); - } - remove - { - throw new NotImplementedException(); - } - } - - public virtual String CodeBase - { - get - { - throw new NotImplementedException(); - } - } - - public virtual String EscapedCodeBase - { - get - { - return AssemblyName.EscapeCodeBase(CodeBase); - } - } - - public virtual AssemblyName GetName() - { - return GetName(false); - } - - public virtual AssemblyName GetName(bool copiedName) - { - throw new NotImplementedException(); - } - - public virtual String FullName - { - get - { - throw new NotImplementedException(); - } - } - - public virtual MethodInfo EntryPoint - { - get - { - throw new NotImplementedException(); - } - } - - public virtual Type GetType(String name) - { - return GetType(name, false, false); - } - - public virtual Type GetType(String name, bool throwOnError) - { - return GetType(name, throwOnError, false); - } - - public virtual Type GetType(String name, bool throwOnError, bool ignoreCase) - { - throw new NotImplementedException(); - } - - public virtual IEnumerable ExportedTypes - { - get - { - return GetExportedTypes(); - } - } - - public virtual Type[] GetExportedTypes() - { - throw new NotImplementedException(); - } - - public virtual IEnumerable DefinedTypes - { - get - { - Type[] types = GetTypes(); - - TypeInfo[] typeinfos = new TypeInfo[types.Length]; - - for (int i = 0; i < types.Length; i++) - { - TypeInfo typeinfo = types[i].GetTypeInfo(); - if (typeinfo == null) - throw new NotSupportedException(Environment.GetResourceString("NotSupported_NoTypeInfo", types[i].FullName)); - - typeinfos[i] = typeinfo; - } - - return typeinfos; - } - } - - public virtual Type[] GetTypes() - { - Module[] m = GetModules(false); - - int iFinalLength = 0; - Type[][] ModuleTypes = new Type[m.Length][]; - - for (int i = 0; i < ModuleTypes.Length; i++) - { - ModuleTypes[i] = m[i].GetTypes(); - iFinalLength += ModuleTypes[i].Length; - } - - int iCurrent = 0; - Type[] ret = new Type[iFinalLength]; - for (int i = 0; i < ModuleTypes.Length; i++) - { - int iLength = ModuleTypes[i].Length; - Array.Copy(ModuleTypes[i], 0, ret, iCurrent, iLength); - iCurrent += iLength; - } - - return ret; - } - - // Load a resource based on the NameSpace of the type. - public virtual Stream GetManifestResourceStream(Type type, String name) - { - throw new NotImplementedException(); - } - - public virtual Stream GetManifestResourceStream(String name) - { - throw new NotImplementedException(); - } - - public virtual Assembly GetSatelliteAssembly(CultureInfo culture) - { - throw new NotImplementedException(); - } - - // Useful for binding to a very specific version of a satellite assembly - public virtual Assembly GetSatelliteAssembly(CultureInfo culture, Version version) - { - throw new NotImplementedException(); - } - - public bool IsFullyTrusted - { - get - { - return true; - } - } - - public virtual SecurityRuleSet SecurityRuleSet - { - get - { - return SecurityRuleSet.None; - } - } - - // ISerializable implementation - public virtual void GetObjectData(SerializationInfo info, StreamingContext context) - { - throw new NotImplementedException(); - } - - public virtual Module ManifestModule - { - get - { - // This API was made virtual in V4. Code compiled against V2 might use - // "call" rather than "callvirt" to call it. - // This makes sure those code still works. - RuntimeAssembly rtAssembly = this as RuntimeAssembly; - if (rtAssembly != null) - return rtAssembly.ManifestModule; - - throw new NotImplementedException(); - } - } - - public virtual IEnumerable CustomAttributes - { - get - { - return GetCustomAttributesData(); - } - } - public virtual Object[] GetCustomAttributes(bool inherit) - { - Contract.Ensures(Contract.Result() != null); - throw new NotImplementedException(); - } - - public virtual Object[] GetCustomAttributes(Type attributeType, bool inherit) - { - Contract.Ensures(Contract.Result() != null); - throw new NotImplementedException(); - } - - public virtual bool IsDefined(Type attributeType, bool inherit) - { - throw new NotImplementedException(); - } - - public virtual IList GetCustomAttributesData() - { - throw new NotImplementedException(); - } - - public virtual bool ReflectionOnly - { - get - { - throw new NotImplementedException(); - } - } - - public Module LoadModule(String moduleName, - byte[] rawModule) - { - return LoadModule(moduleName, rawModule, null); - } - - public virtual Module LoadModule(String moduleName, - byte[] rawModule, - byte[] rawSymbolStore) - { - throw new NotImplementedException(); - } - - // - // Locates a type from this assembly and creates an instance of it using - // the system activator. - // - public Object CreateInstance(String typeName) - { - return CreateInstance(typeName, - false, // ignore case - BindingFlags.Public | BindingFlags.Instance, - null, // binder - null, // args - null, // culture - null); // activation attributes - } - - public Object CreateInstance(String typeName, - bool ignoreCase) - { - return CreateInstance(typeName, - ignoreCase, - BindingFlags.Public | BindingFlags.Instance, - null, // binder - null, // args - null, // culture - null); // activation attributes - } - - public virtual Object CreateInstance(String typeName, - bool ignoreCase, - BindingFlags bindingAttr, - Binder binder, - Object[] args, - CultureInfo culture, - Object[] activationAttributes) - { - Type t = GetType(typeName, false, ignoreCase); - if (t == null) return null; - return Activator.CreateInstance(t, - bindingAttr, - binder, - args, - culture, - activationAttributes); - } - - public virtual IEnumerable Modules - { - get - { - return GetLoadedModules(true); - } - } - - public Module[] GetLoadedModules() - { - return GetLoadedModules(false); - } - - public virtual Module[] GetLoadedModules(bool getResourceModules) - { - throw new NotImplementedException(); - } - - public Module[] GetModules() - { - return GetModules(false); - } - - public virtual Module[] GetModules(bool getResourceModules) - { - throw new NotImplementedException(); - } - - public virtual Module GetModule(String name) - { - throw new NotImplementedException(); - } - - // Returns the file in the File table of the manifest that matches the - // given name. (Name should not include path.) - public virtual FileStream GetFile(String name) - { - throw new NotImplementedException(); - } - - public virtual FileStream[] GetFiles() - { - return GetFiles(false); - } - - public virtual FileStream[] GetFiles(bool getResourceModules) - { - throw new NotImplementedException(); - } - - // Returns the names of all the resources - public virtual String[] GetManifestResourceNames() - { - throw new NotImplementedException(); - } - - public virtual AssemblyName[] GetReferencedAssemblies() - { - throw new NotImplementedException(); - } - - public virtual ManifestResourceInfo GetManifestResourceInfo(String resourceName) - { - throw new NotImplementedException(); - } - - public override String ToString() - { - String displayName = FullName; - if (displayName == null) - return base.ToString(); - else - return displayName; - } - - public virtual String Location - { - get - { - throw new NotImplementedException(); - } - } - - public virtual String ImageRuntimeVersion - { - get - { - throw new NotImplementedException(); - } - } - - /* - Returns true if the assembly was loaded from the global assembly cache. - */ - public virtual bool GlobalAssemblyCache - { - get - { - throw new NotImplementedException(); - } - } - - public virtual Int64 HostContext - { - get - { - // This API was made virtual in V4. Code compiled against V2 might use - // "call" rather than "callvirt" to call it. - // This makes sure those code still works. - RuntimeAssembly rtAssembly = this as RuntimeAssembly; - if (rtAssembly != null) - return rtAssembly.HostContext; - - throw new NotImplementedException(); - } - } - - public virtual bool IsDynamic - { - get - { - return false; - } - } - #endregion // public methods - - } -} diff --git a/src/coreclr/src/mscorlib/src/System/Reflection/Emit/DynamicMethod.cs b/src/coreclr/src/mscorlib/src/System/Reflection/Emit/DynamicMethod.cs index 540a5b7..953b39a 100644 --- a/src/coreclr/src/mscorlib/src/System/Reflection/Emit/DynamicMethod.cs +++ b/src/coreclr/src/mscorlib/src/System/Reflection/Emit/DynamicMethod.cs @@ -534,7 +534,7 @@ namespace System.Reflection.Emit if (position >= 0) { - ParameterInfo[] parameters = m_dynMethod.LoadParameters(); + RuntimeParameterInfo[] parameters = m_dynMethod.LoadParameters(); parameters[position].SetName(parameterName); parameters[position].SetAttributes(attributes); } @@ -583,7 +583,7 @@ namespace System.Reflection.Emit internal class RTDynamicMethod : MethodInfo { internal DynamicMethod m_owner; - private ParameterInfo[] m_parameters; + private RuntimeParameterInfo[] m_parameters; private String m_name; private MethodAttributes m_attributes; private CallingConventions m_callingConvention; @@ -741,12 +741,12 @@ namespace System.Reflection.Emit // private implementation // - internal ParameterInfo[] LoadParameters() + internal RuntimeParameterInfo[] LoadParameters() { if (m_parameters == null) { Type[] parameterTypes = m_owner.m_parameterTypes; - ParameterInfo[] parameters = new ParameterInfo[parameterTypes.Length]; + RuntimeParameterInfo[] parameters = new RuntimeParameterInfo[parameterTypes.Length]; for (int i = 0; i < parameterTypes.Length; i++) parameters[i] = new RuntimeParameterInfo(this, null, parameterTypes[i], i); if (m_parameters == null) diff --git a/src/coreclr/src/mscorlib/src/System/Reflection/Module.CoreCLR.cs b/src/coreclr/src/mscorlib/src/System/Reflection/Module.CoreCLR.cs new file mode 100644 index 0000000..93908b1 --- /dev/null +++ b/src/coreclr/src/mscorlib/src/System/Reflection/Module.CoreCLR.cs @@ -0,0 +1,18 @@ +// 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.Serialization; + +namespace System.Reflection +{ + public abstract partial class Module : ISerializable, ICustomAttributeProvider + { + // Used to provide implementation and overriding point for ModuleHandle. + // To get a module handle inside mscorlib, use GetNativeHandle instead. + internal virtual ModuleHandle GetModuleHandle() + { + return ModuleHandle.EmptyHandle; + } + } +} diff --git a/src/coreclr/src/mscorlib/src/System/Reflection/Module.cs b/src/coreclr/src/mscorlib/src/System/Reflection/Module.cs index b38fb25..53cd63a 100644 --- a/src/coreclr/src/mscorlib/src/System/Reflection/Module.cs +++ b/src/coreclr/src/mscorlib/src/System/Reflection/Module.cs @@ -2,254 +2,66 @@ // 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; +using System.Runtime.Serialization; namespace System.Reflection { - [Serializable] - public abstract class Module : ISerializable, ICustomAttributeProvider + public abstract partial class Module : ICustomAttributeProvider, ISerializable { - #region Static Constructor - static Module() - { - __Filters _fltObj; - _fltObj = new __Filters(); - FilterTypeName = new TypeFilter(_fltObj.FilterTypeName); - FilterTypeNameIgnoreCase = new TypeFilter(_fltObj.FilterTypeNameIgnoreCase); - } - #endregion - - #region Constructor - protected Module() - { - } - #endregion - - #region Public Statics - public static readonly TypeFilter FilterTypeName; - public static readonly TypeFilter FilterTypeNameIgnoreCase; - - public static bool operator ==(Module left, Module right) - { - if (ReferenceEquals(left, right)) - return true; + protected Module() { } - if ((object)left == null || (object)right == null || - left is RuntimeModule || right is RuntimeModule) - { - return false; - } + public virtual Assembly Assembly { get { throw NotImplemented.ByDesign; } } + public virtual string FullyQualifiedName { get { throw NotImplemented.ByDesign; } } + public virtual string Name { get { throw NotImplemented.ByDesign; } } - return left.Equals(right); - } + public virtual int MDStreamVersion { get { throw NotImplemented.ByDesign; } } + public virtual Guid ModuleVersionId { get { throw NotImplemented.ByDesign; } } + public virtual string ScopeName { get { throw NotImplemented.ByDesign; } } + public ModuleHandle ModuleHandle => GetModuleHandle(); + public virtual void GetPEKind(out PortableExecutableKinds peKind, out ImageFileMachine machine) { throw NotImplemented.ByDesign; } + public virtual bool IsResource() { throw NotImplemented.ByDesign; } - public static bool operator !=(Module left, Module right) - { - return !(left == right); - } - - public override bool Equals(object o) - { - return base.Equals(o); - } + public virtual bool IsDefined(Type attributeType, bool inherit) { throw NotImplemented.ByDesign; } + public virtual IEnumerable CustomAttributes => GetCustomAttributesData(); + public virtual IList GetCustomAttributesData() { throw NotImplemented.ByDesign; } + public virtual object[] GetCustomAttributes(bool inherit) { throw NotImplemented.ByDesign; } + public virtual object[] GetCustomAttributes(Type attributeType, bool inherit) { throw NotImplemented.ByDesign; } - public override int GetHashCode() + public MethodInfo GetMethod(string name) => GetMethod(name, null); + public MethodInfo GetMethod(string name, Type[] types) => GetMethod(name, Module.DefaultLookup, null, CallingConventions.Any, types, null); + public MethodInfo GetMethod(string name, BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers) { - return base.GetHashCode(); - } - #endregion - - #region Literals - private const BindingFlags DefaultLookup = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public; - #endregion - - #region object overrides - public override String ToString() - { - return ScopeName; - } - #endregion - - public virtual IEnumerable CustomAttributes - { - get + if (name == null) + throw new ArgumentNullException(nameof(name)); + if (types == null) + throw new ArgumentNullException(nameof(types)); + for (int i = 0; i < types.Length; i++) { - return GetCustomAttributesData(); + if (types[i] == null) + throw new ArgumentNullException(nameof(types)); } - } - #region ICustomAttributeProvider Members - public virtual Object[] GetCustomAttributes(bool inherit) - { - throw new NotImplementedException(); - } - - public virtual Object[] GetCustomAttributes(Type attributeType, bool inherit) - { - throw new NotImplementedException(); - } - - public virtual bool IsDefined(Type attributeType, bool inherit) - { - throw new NotImplementedException(); - } - - public virtual IList GetCustomAttributesData() - { - throw new NotImplementedException(); - } - #endregion - - #region public instances members - public MethodBase ResolveMethod(int metadataToken) - { - return ResolveMethod(metadataToken, null, null); - } - - public virtual MethodBase ResolveMethod(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments) - { - // This API was made virtual in V4. Code compiled against V2 might use - // "call" rather than "callvirt" to call it. - // This makes sure those code still works. - RuntimeModule rtModule = this as RuntimeModule; - if (rtModule != null) - return rtModule.ResolveMethod(metadataToken, genericTypeArguments, genericMethodArguments); - - throw new NotImplementedException(); - } - - public FieldInfo ResolveField(int metadataToken) - { - return ResolveField(metadataToken, null, null); - } - - public virtual FieldInfo ResolveField(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments) - { - // This API was made virtual in V4. Code compiled against V2 might use - // "call" rather than "callvirt" to call it. - // This makes sure those code still works. - RuntimeModule rtModule = this as RuntimeModule; - if (rtModule != null) - return rtModule.ResolveField(metadataToken, genericTypeArguments, genericMethodArguments); - - throw new NotImplementedException(); - } - - public Type ResolveType(int metadataToken) - { - return ResolveType(metadataToken, null, null); - } - - public virtual Type ResolveType(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments) - { - // This API was made virtual in V4. Code compiled against V2 might use - // "call" rather than "callvirt" to call it. - // This makes sure those code still works. - RuntimeModule rtModule = this as RuntimeModule; - if (rtModule != null) - return rtModule.ResolveType(metadataToken, genericTypeArguments, genericMethodArguments); - - throw new NotImplementedException(); + return GetMethodImpl(name, bindingAttr, binder, callConvention, types, modifiers); } - public MemberInfo ResolveMember(int metadataToken) - { - return ResolveMember(metadataToken, null, null); - } + protected virtual MethodInfo GetMethodImpl(string name, BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers) { throw NotImplemented.ByDesign; } - public virtual MemberInfo ResolveMember(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments) - { - // This API was made virtual in V4. Code compiled against V2 might use - // "call" rather than "callvirt" to call it. - // This makes sure those code still works. - RuntimeModule rtModule = this as RuntimeModule; - if (rtModule != null) - return rtModule.ResolveMember(metadataToken, genericTypeArguments, genericMethodArguments); - - throw new NotImplementedException(); - } + public MethodInfo[] GetMethods() => GetMethods(Module.DefaultLookup); + public virtual MethodInfo[] GetMethods(BindingFlags bindingFlags) { throw NotImplemented.ByDesign; } - public virtual byte[] ResolveSignature(int metadataToken) - { - // This API was made virtual in V4. Code compiled against V2 might use - // "call" rather than "callvirt" to call it. - // This makes sure those code still works. - RuntimeModule rtModule = this as RuntimeModule; - if (rtModule != null) - return rtModule.ResolveSignature(metadataToken); - - throw new NotImplementedException(); - } + public FieldInfo GetField(string name) => GetField(name, Module.DefaultLookup); + public virtual FieldInfo GetField(string name, BindingFlags bindingAttr) { throw NotImplemented.ByDesign; } - public virtual string ResolveString(int metadataToken) - { - // This API was made virtual in V4. Code compiled against V2 might use - // "call" rather than "callvirt" to call it. - // This makes sure those code still works. - RuntimeModule rtModule = this as RuntimeModule; - if (rtModule != null) - return rtModule.ResolveString(metadataToken); - - throw new NotImplementedException(); - } + public FieldInfo[] GetFields() => GetFields(Module.DefaultLookup); + public virtual FieldInfo[] GetFields(BindingFlags bindingFlags) { throw NotImplemented.ByDesign; } - public virtual void GetPEKind(out PortableExecutableKinds peKind, out ImageFileMachine machine) - { - // This API was made virtual in V4. Code compiled against V2 might use - // "call" rather than "callvirt" to call it. - // This makes sure those code still works. - RuntimeModule rtModule = this as RuntimeModule; - if (rtModule != null) - rtModule.GetPEKind(out peKind, out machine); - - throw new NotImplementedException(); - } - - public virtual int MDStreamVersion - { - get - { - // This API was made virtual in V4. Code compiled against V2 might use - // "call" rather than "callvirt" to call it. - // This makes sure those code still works. - RuntimeModule rtModule = this as RuntimeModule; - if (rtModule != null) - return rtModule.MDStreamVersion; - - throw new NotImplementedException(); - } - } + public virtual Type[] GetTypes() { throw NotImplemented.ByDesign; } - public virtual void GetObjectData(SerializationInfo info, StreamingContext context) - { - throw new NotImplementedException(); - } + public virtual Type GetType(string className) => GetType(className, throwOnError: false, ignoreCase: false); + public virtual Type GetType(string className, bool ignoreCase) => GetType(className, throwOnError: false, ignoreCase: ignoreCase); + public virtual Type GetType(string className, bool throwOnError, bool ignoreCase) { throw NotImplemented.ByDesign; } - public virtual Type GetType(String className, bool ignoreCase) - { - return GetType(className, false, ignoreCase); - } - - public virtual Type GetType(String className) - { - return GetType(className, false, false); - } - - public virtual Type GetType(String className, bool throwOnError, bool ignoreCase) - { - throw new NotImplementedException(); - } - - public virtual String FullyQualifiedName - { - get - { - throw new NotImplementedException(); - } - } - - public virtual Type[] FindTypes(TypeFilter filter, Object filterCriteria) + public virtual Type[] FindTypes(TypeFilter filter, object filterCriteria) { Type[] c = GetTypes(); int cnt = 0; @@ -273,219 +85,90 @@ namespace System.Reflection return ret; } - public virtual Type[] GetTypes() - { - throw new NotImplementedException(); - } + public virtual int MetadataToken { get { throw NotImplemented.ByDesign; } } - public virtual Guid ModuleVersionId - { - get - { - // This API was made virtual in V4. Code compiled against V2 might use - // "call" rather than "callvirt" to call it. - // This makes sure those code still works. - RuntimeModule rtModule = this as RuntimeModule; - if (rtModule != null) - return rtModule.ModuleVersionId; - - throw new NotImplementedException(); - } - } + public FieldInfo ResolveField(int metadataToken) => ResolveField(metadataToken, null, null); + public virtual FieldInfo ResolveField(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments) { throw NotImplemented.ByDesign; } - public virtual int MetadataToken - { - get - { - // This API was made virtual in V4. Code compiled against V2 might use - // "call" rather than "callvirt" to call it. - // This makes sure those code still works. - RuntimeModule rtModule = this as RuntimeModule; - if (rtModule != null) - return rtModule.MetadataToken; - - throw new NotImplementedException(); - } - } + public MemberInfo ResolveMember(int metadataToken) => ResolveMember(metadataToken, null, null); + public virtual MemberInfo ResolveMember(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments) { throw NotImplemented.ByDesign; } - public virtual bool IsResource() - { - // This API was made virtual in V4. Code compiled against V2 might use - // "call" rather than "callvirt" to call it. - // This makes sure those code still works. - RuntimeModule rtModule = this as RuntimeModule; - if (rtModule != null) - return rtModule.IsResource(); - - throw new NotImplementedException(); - } + public MethodBase ResolveMethod(int metadataToken) => ResolveMethod(metadataToken, null, null); + public virtual MethodBase ResolveMethod(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments) { throw NotImplemented.ByDesign; } - public FieldInfo[] GetFields() - { - return GetFields(Module.DefaultLookup); - } + public virtual byte[] ResolveSignature(int metadataToken) { throw NotImplemented.ByDesign; } + public virtual string ResolveString(int metadataToken) { throw NotImplemented.ByDesign; } - public virtual FieldInfo[] GetFields(BindingFlags bindingFlags) - { - // This API was made virtual in V4. Code compiled against V2 might use - // "call" rather than "callvirt" to call it. - // This makes sure those code still works. - RuntimeModule rtModule = this as RuntimeModule; - if (rtModule != null) - return rtModule.GetFields(bindingFlags); - - throw new NotImplementedException(); - } + public Type ResolveType(int metadataToken) => ResolveType(metadataToken, null, null); + public virtual Type ResolveType(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments) { throw NotImplemented.ByDesign; } - public FieldInfo GetField(String name) - { - return GetField(name, Module.DefaultLookup); - } + public virtual void GetObjectData(SerializationInfo info, StreamingContext context) { throw NotImplemented.ByDesign; } - public virtual FieldInfo GetField(String name, BindingFlags bindingAttr) - { - // This API was made virtual in V4. Code compiled against V2 might use - // "call" rather than "callvirt" to call it. - // This makes sure those code still works. - RuntimeModule rtModule = this as RuntimeModule; - if (rtModule != null) - return rtModule.GetField(name, bindingAttr); - - throw new NotImplementedException(); - } + public override bool Equals(object o) => base.Equals(o); + public override int GetHashCode() => base.GetHashCode(); - public MethodInfo[] GetMethods() - { - return GetMethods(Module.DefaultLookup); - } - - public virtual MethodInfo[] GetMethods(BindingFlags bindingFlags) - { - // This API was made virtual in V4. Code compiled against V2 might use - // "call" rather than "callvirt" to call it. - // This makes sure those code still works. - RuntimeModule rtModule = this as RuntimeModule; - if (rtModule != null) - return rtModule.GetMethods(bindingFlags); - - throw new NotImplementedException(); - } - - public MethodInfo GetMethod( - String name, BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers) + public static bool operator ==(Module left, Module right) { - if (name == null) - throw new ArgumentNullException(nameof(name)); - - if (types == null) - throw new ArgumentNullException(nameof(types)); - Contract.EndContractBlock(); + if (object.ReferenceEquals(left, right)) + return true; - for (int i = 0; i < types.Length; i++) - { - if (types[i] == null) - throw new ArgumentNullException(nameof(types)); - } + if ((object)left == null || (object)right == null) + return false; - return GetMethodImpl(name, bindingAttr, binder, callConvention, types, modifiers); + return left.Equals(right); } - public MethodInfo GetMethod(String name, Type[] types) - { - if (name == null) - throw new ArgumentNullException(nameof(name)); + public static bool operator !=(Module left, Module right) => !(left == right); - if (types == null) - throw new ArgumentNullException(nameof(types)); - Contract.EndContractBlock(); + public override string ToString() => ScopeName; - for (int i = 0; i < types.Length; i++) - { - if (types[i] == null) - throw new ArgumentNullException(nameof(types)); - } + public static readonly TypeFilter FilterTypeName = FilterTypeNameImpl; + public static readonly TypeFilter FilterTypeNameIgnoreCase = FilterTypeNameIgnoreCaseImpl; - return GetMethodImpl(name, Module.DefaultLookup, null, CallingConventions.Any, types, null); - } + private const BindingFlags DefaultLookup = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public; - public MethodInfo GetMethod(String name) + // FilterTypeName + // This method will filter the class based upon the name. It supports + // a trailing wild card. + private static bool FilterTypeNameImpl(Type cls, object filterCriteria) { - if (name == null) - throw new ArgumentNullException(nameof(name)); - Contract.EndContractBlock(); + // Check that the criteria object is a String object + if (filterCriteria == null || !(filterCriteria is string)) + throw new InvalidFilterCriteriaException(SR.InvalidFilterCriteriaException_CritString); - return GetMethodImpl(name, Module.DefaultLookup, null, CallingConventions.Any, - null, null); - } + string str = (string)filterCriteria; - protected virtual MethodInfo GetMethodImpl(String name, BindingFlags bindingAttr, Binder binder, - CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers) - { - throw new NotImplementedException(); - } - - public virtual String ScopeName - { - get + // Check to see if this is a prefix or exact match requirement + if (str.Length > 0 && str[str.Length - 1] == '*') { - // This API was made virtual in V4. Code compiled against V2 might use - // "call" rather than "callvirt" to call it. - // This makes sure those code still works. - RuntimeModule rtModule = this as RuntimeModule; - if (rtModule != null) - return rtModule.ScopeName; - - throw new NotImplementedException(); + str = str.Substring(0, str.Length - 1); + return cls.Name.StartsWith(str, StringComparison.Ordinal); } - } - public virtual String Name - { - get - { - // This API was made virtual in V4. Code compiled against V2 might use - // "call" rather than "callvirt" to call it. - // This makes sure those code still works. - RuntimeModule rtModule = this as RuntimeModule; - if (rtModule != null) - return rtModule.Name; - - throw new NotImplementedException(); - } + return cls.Name.Equals(str); } - public virtual Assembly Assembly + // FilterFieldNameIgnoreCase + // This method filter the Type based upon name, it ignores case. + private static bool FilterTypeNameIgnoreCaseImpl(Type cls, object filterCriteria) { - [Pure] - get - { - // This API was made virtual in V4. Code compiled against V2 might use - // "call" rather than "callvirt" to call it. - // This makes sure those code still works. - RuntimeModule rtModule = this as RuntimeModule; - if (rtModule != null) - return rtModule.Assembly; - - throw new NotImplementedException(); - } - } + // Check that the criteria object is a String object + if (filterCriteria == null || !(filterCriteria is string)) + throw new InvalidFilterCriteriaException(SR.InvalidFilterCriteriaException_CritString); - // This API never fails, it will return an empty handle for non-runtime handles and - // a valid handle for reflection only modules. - public ModuleHandle ModuleHandle - { - get + string str = (string)filterCriteria; + + // Check to see if this is a prefix or exact match requirement + if (str.Length > 0 && str[str.Length - 1] == '*') { - return GetModuleHandle(); + str = str.Substring(0, str.Length - 1); + string name = cls.Name; + if (name.Length >= str.Length) + return (string.Compare(name, 0, str, 0, str.Length, StringComparison.OrdinalIgnoreCase) == 0); + else + return false; } + return (string.Compare(str, cls.Name, StringComparison.OrdinalIgnoreCase) == 0); } - - // Used to provide implementation and overriding point for ModuleHandle. - // To get a module handle inside mscorlib, use GetNativeHandle instead. - internal virtual ModuleHandle GetModuleHandle() - { - return ModuleHandle.EmptyHandle; - } - #endregion } } diff --git a/src/coreclr/src/mscorlib/src/System/Reflection/ParameterInfo.cs b/src/coreclr/src/mscorlib/src/System/Reflection/ParameterInfo.cs deleted file mode 100644 index 01fe2e0..0000000 --- a/src/coreclr/src/mscorlib/src/System/Reflection/ParameterInfo.cs +++ /dev/null @@ -1,224 +0,0 @@ -// 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; - -namespace System.Reflection -{ - [Serializable] - public class ParameterInfo : ICustomAttributeProvider, IObjectReference - { - #region Legacy Protected Members - protected String NameImpl; - protected Type ClassImpl; - protected int PositionImpl; - protected ParameterAttributes AttrsImpl; - protected Object DefaultValueImpl; // cannot cache this as it may be non agile user defined enum - protected MemberInfo MemberImpl; - #endregion - - #region Legacy Private Members - // These are here only for backwards compatibility -- they are not set - // until this instance is serialized, so don't rely on their values from - // arbitrary code. -#pragma warning disable 169 - [OptionalField] - private IntPtr _importer; - [OptionalField] - private int _token; - [OptionalField] - private bool bExtraConstChecked; -#pragma warning restore 169 - #endregion - - #region Constructor - protected ParameterInfo() - { - } - #endregion - - #region Internal Members - // this is an internal api for DynamicMethod. A better solution is to change the relationship - // between ParameterInfo and ParameterBuilder so that a ParameterBuilder can be seen as a writer - // api over a ParameterInfo. However that is a possible breaking change so it needs to go through some process first - internal void SetName(String name) - { - NameImpl = name; - } - - internal void SetAttributes(ParameterAttributes attributes) - { - AttrsImpl = attributes; - } - #endregion - - #region Public Methods - public virtual Type ParameterType - { - get - { - return ClassImpl; - } - } - - public virtual String Name - { - get - { - return NameImpl; - } - } - - public virtual bool HasDefaultValue { get { throw new NotImplementedException(); } } - - public virtual Object DefaultValue { get { throw new NotImplementedException(); } } - public virtual Object RawDefaultValue { get { throw new NotImplementedException(); } } - - public virtual int Position { get { return PositionImpl; } } - public virtual ParameterAttributes Attributes { get { return AttrsImpl; } } - - public virtual MemberInfo Member - { - get - { - Contract.Ensures(Contract.Result() != null); - return MemberImpl; - } - } - - public bool IsIn { get { return ((Attributes & ParameterAttributes.In) != 0); } } - public bool IsOut { get { return ((Attributes & ParameterAttributes.Out) != 0); } } - public bool IsLcid { get { return ((Attributes & ParameterAttributes.Lcid) != 0); } } - public bool IsRetval { get { return ((Attributes & ParameterAttributes.Retval) != 0); } } - public bool IsOptional { get { return ((Attributes & ParameterAttributes.Optional) != 0); } } - - public virtual int MetadataToken - { - get - { - // This API was made virtual in V4. Code compiled against V2 might use - // "call" rather than "callvirt" to call it. - // This makes sure those code still works. - RuntimeParameterInfo rtParam = this as RuntimeParameterInfo; - if (rtParam != null) - return rtParam.MetadataToken; - - // return a null token - return (int)MetadataTokenType.ParamDef; - } - } - - public virtual Type[] GetRequiredCustomModifiers() - { - return EmptyArray.Value; - } - - public virtual Type[] GetOptionalCustomModifiers() - { - return EmptyArray.Value; - } - #endregion - - #region Object Overrides - public override String ToString() - { - return ParameterType.FormatTypeName() + " " + Name; - } - #endregion - - public virtual IEnumerable CustomAttributes - { - get - { - return GetCustomAttributesData(); - } - } - #region ICustomAttributeProvider - public virtual Object[] GetCustomAttributes(bool inherit) - { - return EmptyArray.Value; - } - - public virtual Object[] GetCustomAttributes(Type attributeType, bool inherit) - { - if (attributeType == null) - throw new ArgumentNullException(nameof(attributeType)); - Contract.EndContractBlock(); - - return EmptyArray.Value; - } - - public virtual bool IsDefined(Type attributeType, bool inherit) - { - if (attributeType == null) - throw new ArgumentNullException(nameof(attributeType)); - Contract.EndContractBlock(); - - return false; - } - - public virtual IList GetCustomAttributesData() - { - throw new NotImplementedException(); - } - #endregion - - #region _ParameterInfo implementation - - #endregion - - #region IObjectReference - // In V4 RuntimeParameterInfo is introduced. - // To support deserializing ParameterInfo instances serialized in earlier versions - // we need to implement IObjectReference. - public object GetRealObject(StreamingContext context) - { - Contract.Ensures(Contract.Result() != null); - - // Once all the serializable fields have come in we can set up the real - // instance based on just two of them (MemberImpl and PositionImpl). - - if (MemberImpl == null) - throw new SerializationException(Environment.GetResourceString(ResId.Serialization_InsufficientState)); - - ParameterInfo[] args = null; - - switch (MemberImpl.MemberType) - { - case MemberTypes.Constructor: - case MemberTypes.Method: - if (PositionImpl == -1) - { - if (MemberImpl.MemberType == MemberTypes.Method) - return ((MethodInfo)MemberImpl).ReturnParameter; - else - throw new SerializationException(Environment.GetResourceString(ResId.Serialization_BadParameterInfo)); - } - else - { - args = ((MethodBase)MemberImpl).GetParametersNoCopy(); - - if (args != null && PositionImpl < args.Length) - return args[PositionImpl]; - else - throw new SerializationException(Environment.GetResourceString(ResId.Serialization_BadParameterInfo)); - } - - case MemberTypes.Property: - args = ((RuntimePropertyInfo)MemberImpl).GetIndexParametersNoCopy(); - - if (args != null && PositionImpl > -1 && PositionImpl < args.Length) - return args[PositionImpl]; - else - throw new SerializationException(Environment.GetResourceString(ResId.Serialization_BadParameterInfo)); - - default: - throw new SerializationException(Environment.GetResourceString(ResId.Serialization_NoParameterInfo)); - } - } - #endregion - } -} diff --git a/src/coreclr/src/mscorlib/src/System/Reflection/RuntimeParameterInfo.cs b/src/coreclr/src/mscorlib/src/System/Reflection/RuntimeParameterInfo.cs index 516df6c..5fb2e92 100644 --- a/src/coreclr/src/mscorlib/src/System/Reflection/RuntimeParameterInfo.cs +++ b/src/coreclr/src/mscorlib/src/System/Reflection/RuntimeParameterInfo.cs @@ -148,6 +148,18 @@ namespace System.Reflection } #endregion + #region Internal Methods + internal void SetName(string name) + { + NameImpl = name; + } + + internal void SetAttributes(ParameterAttributes attributes) + { + AttrsImpl = attributes; + } + #endregion + #region VTS magic to serialize/deserialized to/from pre-Whidbey endpoints. public void GetObjectData(SerializationInfo info, StreamingContext context) { diff --git a/src/coreclr/src/mscorlib/src/System/Reflection/__Filters.cs b/src/coreclr/src/mscorlib/src/System/Reflection/__Filters.cs deleted file mode 100644 index 582fb5a..0000000 --- a/src/coreclr/src/mscorlib/src/System/Reflection/__Filters.cs +++ /dev/null @@ -1,71 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -//////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////// -// -// -// This class defines the delegate methods for the COM+ implemented filters. -// This is the reflection version of these. There is also a _Filters class in -// runtime which is related to this. -// -// -// -// - -using System; -using System.Globalization; - -namespace System.Reflection -{ - [Serializable] - internal class __Filters - { - // FilterTypeName - // This method will filter the class based upon the name. It supports - // a trailing wild card. - public virtual bool FilterTypeName(Type cls, Object filterCriteria) - { - // Check that the criteria object is a String object - if (filterCriteria == null || !(filterCriteria is String)) - throw new InvalidFilterCriteriaException(System.Environment.GetResourceString("RFLCT.FltCritString")); - - String str = (String)filterCriteria; - //str = str.Trim(); - - // Check to see if this is a prefix or exact match requirement - if (str.Length > 0 && str[str.Length - 1] == '*') - { - str = str.Substring(0, str.Length - 1); - return cls.Name.StartsWith(str, StringComparison.Ordinal); - } - - return cls.Name.Equals(str); - } - - // FilterFieldNameIgnoreCase - // This method filter the Type based upon name, it ignores case. - public virtual bool FilterTypeNameIgnoreCase(Type cls, Object filterCriteria) - { - // Check that the criteria object is a String object - if (filterCriteria == null || !(filterCriteria is String)) - throw new InvalidFilterCriteriaException(System.Environment.GetResourceString("RFLCT.FltCritString")); - - String str = (String)filterCriteria; - //str = str.Trim(); - - // Check to see if this is a prefix or exact match requirement - if (str.Length > 0 && str[str.Length - 1] == '*') - { - str = str.Substring(0, str.Length - 1); - String name = cls.Name; - if (name.Length >= str.Length) - return (String.Compare(name, 0, str, 0, str.Length, StringComparison.OrdinalIgnoreCase) == 0); - else - return false; - } - return (String.Compare(str, cls.Name, StringComparison.OrdinalIgnoreCase) == 0); - } - } -} -- 2.7.4