2014-08-13 10:39:27 +01:00
//
2019-04-12 14:10:50 +00:00
// System.Reflection/RuntimeModule.cs
2014-08-13 10:39:27 +01:00
//
// Author:
// Rodrigo Kumpera (rkumpera@novell.com)
//
// Copyright (C) 2010 Novell, Inc (http://www.novell.com)
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
using System ;
using System.Collections ;
using System.Collections.Generic ;
using System.Globalization ;
using System.Runtime.InteropServices ;
2019-07-26 19:53:28 +00:00
using System.Runtime.CompilerServices ;
#if ! NETCORE
2014-08-13 10:39:27 +01:00
using System.Security.Cryptography.X509Certificates ;
using System.Security ;
using System.Security.Permissions ;
2019-07-26 19:53:28 +00:00
#endif
2015-04-07 09:35:12 +01:00
using System.Runtime.Serialization ;
2014-08-13 10:39:27 +01:00
namespace System.Reflection {
[ComVisible (true)]
2019-07-26 19:53:28 +00:00
#if ! NETCORE
2014-08-13 10:39:27 +01:00
[ComDefaultInterfaceAttribute (typeof (_Module))]
2019-07-26 19:53:28 +00:00
#endif
2014-08-13 10:39:27 +01:00
[Serializable]
[ClassInterface(ClassInterfaceType.None)]
2019-04-12 14:10:50 +00:00
[StructLayout (LayoutKind.Sequential)]
class RuntimeModule : Module
2015-08-26 07:17:56 -04:00
{
2019-04-12 14:10:50 +00:00
#pragma warning disable 649
#region Sync with object - internals . h
#region Sync with ModuleBuilder
internal IntPtr _impl ; /* a pointer to a MonoImage */
internal Assembly assembly ;
internal string fqname ;
internal string name ;
internal string scopename ;
internal bool is_resource ;
internal int token ;
#endregion
#endregion
#pragma warning restore 649
2014-08-13 10:39:27 +01:00
public
override
Assembly Assembly {
get { return assembly ; }
}
public
override
// Note: we do not ask for PathDiscovery because no path is returned here.
// However MS Fx requires it (see FDBK23572 for details).
string Name {
get { return name ; }
}
public
override
string ScopeName {
get { return scopename ; }
}
public
override
int MDStreamVersion {
get {
if ( _impl = = IntPtr . Zero )
throw new NotSupportedException ( ) ;
return GetMDStreamVersion ( _impl ) ;
}
}
public
override
Guid ModuleVersionId {
get {
return GetModuleVersionId ( ) ;
}
}
public override
string FullyQualifiedName {
get {
2019-07-26 19:53:28 +00:00
#if ! MOBILE & & ! NETCORE
2014-08-13 10:39:27 +01:00
if ( SecurityManager . SecurityEnabled ) {
new FileIOPermission ( FileIOPermissionAccess . PathDiscovery , fqname ) . Demand ( ) ;
}
#endif
return fqname ;
}
}
public
override
bool IsResource ( )
{
return is_resource ;
}
public override
Type [ ] FindTypes ( TypeFilter filter , object filterCriteria )
{
var filtered = new List < Type > ( ) ;
Type [ ] types = GetTypes ( ) ;
foreach ( Type t in types )
if ( filter ( t , filterCriteria ) )
filtered . Add ( t ) ;
return filtered . ToArray ( ) ;
}
public override
object [ ] GetCustomAttributes ( bool inherit )
{
return MonoCustomAttrs . GetCustomAttributes ( this , inherit ) ;
}
public override
object [ ] GetCustomAttributes ( Type attributeType , bool inherit )
{
return MonoCustomAttrs . GetCustomAttributes ( this , attributeType , inherit ) ;
}
public override
FieldInfo GetField ( string name , BindingFlags bindingAttr )
{
2015-08-26 07:17:56 -04:00
if ( name = = null )
throw new ArgumentNullException ( "name" ) ;
2014-08-13 10:39:27 +01:00
if ( IsResource ( ) )
return null ;
2019-07-26 19:53:28 +00:00
Type globalType = GetGlobalType ( _impl ) ;
2014-08-13 10:39:27 +01:00
return ( globalType ! = null ) ? globalType . GetField ( name , bindingAttr ) : null ;
}
public override
FieldInfo [ ] GetFields ( BindingFlags bindingFlags )
{
if ( IsResource ( ) )
return new FieldInfo [ 0 ] ;
2019-07-26 19:53:28 +00:00
Type globalType = GetGlobalType ( _impl ) ;
2014-08-13 10:39:27 +01:00
return ( globalType ! = null ) ? globalType . GetFields ( bindingFlags ) : new FieldInfo [ 0 ] ;
}
public override
int MetadataToken {
2019-07-26 19:53:28 +00:00
get {
return get_MetadataToken ( this ) ;
}
2014-08-13 10:39:27 +01:00
}
2019-07-26 19:53:28 +00:00
2014-08-13 10:39:27 +01:00
protected
override
MethodInfo GetMethodImpl ( string name , BindingFlags bindingAttr , Binder binder , CallingConventions callConvention , Type [ ] types , ParameterModifier [ ] modifiers )
{
if ( IsResource ( ) )
return null ;
2019-07-26 19:53:28 +00:00
Type globalType = GetGlobalType ( _impl ) ;
2014-08-13 10:39:27 +01:00
if ( globalType = = null )
return null ;
if ( types = = null )
return globalType . GetMethod ( name ) ;
return globalType . GetMethod ( name , bindingAttr , binder , callConvention , types , modifiers ) ;
}
public
override
MethodInfo [ ] GetMethods ( BindingFlags bindingFlags ) {
if ( IsResource ( ) )
return new MethodInfo [ 0 ] ;
2019-07-26 19:53:28 +00:00
Type globalType = GetGlobalType ( _impl ) ;
2014-08-13 10:39:27 +01:00
return ( globalType ! = null ) ? globalType . GetMethods ( bindingFlags ) : new MethodInfo [ 0 ] ;
}
2019-07-26 19:53:28 +00:00
#if ! NETCORE
2019-04-12 14:10:50 +00:00
internal override ModuleHandle GetModuleHandleImpl ( ) = > new ModuleHandle ( _impl ) ;
2019-07-26 19:53:28 +00:00
#endif
2019-04-12 14:10:50 +00:00
2014-08-13 10:39:27 +01:00
public override
void GetPEKind ( out PortableExecutableKinds peKind , out ImageFileMachine machine ) {
2019-07-26 19:53:28 +00:00
RuntimeModule . GetPEKind ( _impl , out peKind , out machine ) ;
2014-08-13 10:39:27 +01:00
}
public override
Type GetType ( string className , bool throwOnError , bool ignoreCase )
{
if ( className = = null )
throw new ArgumentNullException ( "className" ) ;
if ( className = = String . Empty )
throw new ArgumentException ( "Type name can't be empty" ) ;
return assembly . InternalGetType ( this , className , throwOnError , ignoreCase ) ;
}
public override
bool IsDefined ( Type attributeType , bool inherit )
{
return MonoCustomAttrs . IsDefined ( this , attributeType , inherit ) ;
}
public
override
FieldInfo ResolveField ( int metadataToken , Type [ ] genericTypeArguments , Type [ ] genericMethodArguments ) {
2019-07-26 19:53:28 +00:00
return ResolveField ( this , _impl , metadataToken , genericTypeArguments , genericMethodArguments ) ;
}
internal static FieldInfo ResolveField ( Module module , IntPtr monoModule , int metadataToken , Type [ ] genericTypeArguments , Type [ ] genericMethodArguments ) {
2014-08-13 10:39:27 +01:00
ResolveTokenError error ;
2019-07-26 19:53:28 +00:00
IntPtr handle = ResolveFieldToken ( monoModule , metadataToken , ptrs_from_types ( genericTypeArguments ) , ptrs_from_types ( genericMethodArguments ) , out error ) ;
2014-08-13 10:39:27 +01:00
if ( handle = = IntPtr . Zero )
2019-07-26 19:53:28 +00:00
throw resolve_token_exception ( module . Name , metadataToken , error , "Field" ) ;
2014-08-13 10:39:27 +01:00
else
return FieldInfo . GetFieldFromHandle ( new RuntimeFieldHandle ( handle ) ) ;
}
public
override
MemberInfo ResolveMember ( int metadataToken , Type [ ] genericTypeArguments , Type [ ] genericMethodArguments ) {
2019-07-26 19:53:28 +00:00
return ResolveMember ( this , _impl , metadataToken , genericTypeArguments , genericMethodArguments ) ;
}
2014-08-13 10:39:27 +01:00
2019-07-26 19:53:28 +00:00
internal static MemberInfo ResolveMember ( Module module , IntPtr monoModule , int metadataToken , Type [ ] genericTypeArguments , Type [ ] genericMethodArguments ) {
2014-08-13 10:39:27 +01:00
ResolveTokenError error ;
2019-07-26 19:53:28 +00:00
MemberInfo m = ResolveMemberToken ( monoModule , metadataToken , ptrs_from_types ( genericTypeArguments ) , ptrs_from_types ( genericMethodArguments ) , out error ) ;
2014-08-13 10:39:27 +01:00
if ( m = = null )
2019-07-26 19:53:28 +00:00
throw resolve_token_exception ( module . Name , metadataToken , error , "MemberInfo" ) ;
2014-08-13 10:39:27 +01:00
else
return m ;
}
public
override
MethodBase ResolveMethod ( int metadataToken , Type [ ] genericTypeArguments , Type [ ] genericMethodArguments ) {
2019-07-26 19:53:28 +00:00
return ResolveMethod ( this , _impl , metadataToken , genericTypeArguments , genericMethodArguments ) ;
}
internal static MethodBase ResolveMethod ( Module module , IntPtr monoModule , int metadataToken , Type [ ] genericTypeArguments , Type [ ] genericMethodArguments ) {
2014-08-13 10:39:27 +01:00
ResolveTokenError error ;
2019-07-26 19:53:28 +00:00
IntPtr handle = ResolveMethodToken ( monoModule , metadataToken , ptrs_from_types ( genericTypeArguments ) , ptrs_from_types ( genericMethodArguments ) , out error ) ;
2014-08-13 10:39:27 +01:00
if ( handle = = IntPtr . Zero )
2019-07-26 19:53:28 +00:00
throw resolve_token_exception ( module . Name , metadataToken , error , "MethodBase" ) ;
2014-08-13 10:39:27 +01:00
else
2019-04-12 14:10:50 +00:00
return RuntimeMethodInfo . GetMethodFromHandleNoGenericCheck ( new RuntimeMethodHandle ( handle ) ) ;
2014-08-13 10:39:27 +01:00
}
public
override
string ResolveString ( int metadataToken ) {
2019-07-26 19:53:28 +00:00
return ResolveString ( this , _impl , metadataToken ) ;
}
internal static string ResolveString ( Module module , IntPtr monoModule , int metadataToken ) {
2014-08-13 10:39:27 +01:00
ResolveTokenError error ;
2019-07-26 19:53:28 +00:00
string s = ResolveStringToken ( monoModule , metadataToken , out error ) ;
2014-08-13 10:39:27 +01:00
if ( s = = null )
2019-07-26 19:53:28 +00:00
throw resolve_token_exception ( module . Name , metadataToken , error , "string" ) ;
2014-08-13 10:39:27 +01:00
else
return s ;
}
public
override
Type ResolveType ( int metadataToken , Type [ ] genericTypeArguments , Type [ ] genericMethodArguments ) {
2019-07-26 19:53:28 +00:00
return ResolveType ( this , _impl , metadataToken , genericTypeArguments , genericMethodArguments ) ;
}
internal static Type ResolveType ( Module module , IntPtr monoModule , int metadataToken , Type [ ] genericTypeArguments , Type [ ] genericMethodArguments ) {
2014-08-13 10:39:27 +01:00
ResolveTokenError error ;
2019-07-26 19:53:28 +00:00
IntPtr handle = ResolveTypeToken ( monoModule , metadataToken , ptrs_from_types ( genericTypeArguments ) , ptrs_from_types ( genericMethodArguments ) , out error ) ;
2014-08-13 10:39:27 +01:00
if ( handle = = IntPtr . Zero )
2019-07-26 19:53:28 +00:00
throw resolve_token_exception ( module . Name , metadataToken , error , "Type" ) ;
2014-08-13 10:39:27 +01:00
else
return Type . GetTypeFromHandle ( new RuntimeTypeHandle ( handle ) ) ;
}
public
override
byte [ ] ResolveSignature ( int metadataToken ) {
2019-07-26 19:53:28 +00:00
return ResolveSignature ( this , _impl , metadataToken ) ;
}
internal static byte [ ] ResolveSignature ( Module module , IntPtr monoModule , int metadataToken ) {
2014-08-13 10:39:27 +01:00
ResolveTokenError error ;
2019-07-26 19:53:28 +00:00
byte [ ] res = ResolveSignature ( monoModule , metadataToken , out error ) ;
2014-08-13 10:39:27 +01:00
if ( res = = null )
2019-07-26 19:53:28 +00:00
throw resolve_token_exception ( module . Name , metadataToken , error , "signature" ) ;
2014-08-13 10:39:27 +01:00
else
return res ;
}
2019-07-26 19:53:28 +00:00
#if ! NETCORE
2015-04-07 09:35:12 +01:00
public override void GetObjectData ( SerializationInfo info , StreamingContext context )
{
if ( info = = null )
throw new ArgumentNullException ( "info" ) ;
UnitySerializationHolder . GetUnitySerializationInfo ( info , UnitySerializationHolder . ModuleUnity , this . ScopeName , this . GetRuntimeAssembly ( ) ) ;
}
2019-07-26 19:53:28 +00:00
#endif
2015-04-07 09:35:12 +01:00
2019-07-26 19:53:28 +00:00
#if ! MOBILE & & ! NETCORE
2014-08-13 10:39:27 +01:00
public
override
X509Certificate GetSignerCertificate ( )
{
try {
return X509Certificate . CreateFromSignedFile ( assembly . Location ) ;
}
catch {
return null ;
}
}
#endif
public override
Type [ ] GetTypes ( )
{
2019-07-26 19:53:28 +00:00
return InternalGetTypes ( _impl ) ;
2014-08-13 10:39:27 +01:00
}
public override IList < CustomAttributeData > GetCustomAttributesData ( ) {
return CustomAttributeData . GetCustomAttributes ( this ) ;
}
2015-04-07 09:35:12 +01:00
internal RuntimeAssembly GetRuntimeAssembly ( )
{
return ( RuntimeAssembly ) assembly ;
}
2019-04-12 14:10:50 +00:00
2019-07-26 19:53:28 +00:00
internal IntPtr MonoModule {
get {
return _impl ;
}
}
#if NETCORE
internal Guid GetModuleVersionId ( )
#else
internal override Guid GetModuleVersionId ( )
#endif
{
var guid = new byte [ 16 ] ;
GetGuidInternal ( _impl , guid ) ;
return new Guid ( guid ) ;
2019-04-12 14:10:50 +00:00
}
2019-07-26 19:53:28 +00:00
internal static Exception resolve_token_exception ( string name , int metadataToken , ResolveTokenError error , string tokenType ) {
if ( error = = ResolveTokenError . OutOfRange )
return new ArgumentOutOfRangeException ( "metadataToken" , String . Format ( "Token 0x{0:x} is not valid in the scope of module {1}" , metadataToken , name ) ) ;
else
return new ArgumentException ( String . Format ( "Token 0x{0:x} is not a valid {1} token in the scope of module {2}" , metadataToken , tokenType , name ) , "metadataToken" ) ;
}
internal static IntPtr [ ] ptrs_from_types ( Type [ ] types ) {
if ( types = = null )
return null ;
else {
IntPtr [ ] res = new IntPtr [ types . Length ] ;
for ( int i = 0 ; i < types . Length ; + + i ) {
if ( types [ i ] = = null )
throw new ArgumentException ( ) ;
res [ i ] = types [ i ] . TypeHandle . Value ;
}
return res ;
}
}
// This calls ves_icall_reflection_get_token, so needs a Module argument
[MethodImplAttribute (MethodImplOptions.InternalCall)]
internal static extern int get_MetadataToken ( Module module ) ;
[MethodImplAttribute (MethodImplOptions.InternalCall)]
internal static extern int GetMDStreamVersion ( IntPtr module ) ;
[MethodImplAttribute (MethodImplOptions.InternalCall)]
internal static extern Type [ ] InternalGetTypes ( IntPtr module ) ;
[MethodImplAttribute (MethodImplOptions.InternalCall)]
internal static extern IntPtr GetHINSTANCE ( IntPtr module ) ;
[MethodImplAttribute (MethodImplOptions.InternalCall)]
private static extern void GetGuidInternal ( IntPtr module , byte [ ] guid ) ;
[MethodImplAttribute (MethodImplOptions.InternalCall)]
internal static extern Type GetGlobalType ( IntPtr module ) ;
[MethodImplAttribute (MethodImplOptions.InternalCall)]
internal static extern IntPtr ResolveTypeToken ( IntPtr module , int token , IntPtr [ ] type_args , IntPtr [ ] method_args , out ResolveTokenError error ) ;
[MethodImplAttribute (MethodImplOptions.InternalCall)]
internal static extern IntPtr ResolveMethodToken ( IntPtr module , int token , IntPtr [ ] type_args , IntPtr [ ] method_args , out ResolveTokenError error ) ;
[MethodImplAttribute (MethodImplOptions.InternalCall)]
internal static extern IntPtr ResolveFieldToken ( IntPtr module , int token , IntPtr [ ] type_args , IntPtr [ ] method_args , out ResolveTokenError error ) ;
[MethodImplAttribute (MethodImplOptions.InternalCall)]
internal static extern string ResolveStringToken ( IntPtr module , int token , out ResolveTokenError error ) ;
[MethodImplAttribute (MethodImplOptions.InternalCall)]
internal static extern MemberInfo ResolveMemberToken ( IntPtr module , int token , IntPtr [ ] type_args , IntPtr [ ] method_args , out ResolveTokenError error ) ;
[MethodImplAttribute (MethodImplOptions.InternalCall)]
internal static extern byte [ ] ResolveSignature ( IntPtr module , int metadataToken , out ResolveTokenError error ) ;
[MethodImplAttribute (MethodImplOptions.InternalCall)]
internal static extern void GetPEKind ( IntPtr module , out PortableExecutableKinds peKind , out ImageFileMachine machine ) ;
2014-08-13 10:39:27 +01:00
}
2019-07-26 19:53:28 +00:00
internal enum ResolveTokenError {
OutOfRange ,
BadTable ,
Other
}
2014-08-13 10:39:27 +01:00
}