Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / clr / src / BCL / System / Reflection / Emit / TypeBuilder.cs / 1305376 / TypeBuilder.cs
// ==++== // // Copyright(c) Microsoft Corporation. All rights reserved. // // ==--== //[....] // namespace System.Reflection.Emit { using System; using System.Reflection; using System.Security; using System.Security.Permissions; using System.Diagnostics; using System.Runtime.InteropServices; using System.Runtime.CompilerServices; using System.Collections.Generic; using CultureInfo = System.Globalization.CultureInfo; using System.Threading; using System.Runtime.Versioning; using System.Diagnostics.Contracts; [Serializable] [System.Runtime.InteropServices.ComVisible(true)] public enum PackingSize { Unspecified = 0, Size1 = 1, Size2 = 2, Size4 = 4, Size8 = 8, Size16 = 16, Size32 = 32, Size64 = 64, Size128 = 128, } [HostProtection(MayLeakOnAbort = true)] [ClassInterface(ClassInterfaceType.None)] [ComDefaultInterface(typeof(_TypeBuilder))] [System.Runtime.InteropServices.ComVisible(true)] public sealed class TypeBuilder : Type, _TypeBuilder { #region Declarations internal class CustAttr { private ConstructorInfo m_con; private byte[] m_binaryAttribute; private CustomAttributeBuilder m_customBuilder; public CustAttr(ConstructorInfo con, byte[] binaryAttribute) { if (con == null) throw new ArgumentNullException("con"); if (binaryAttribute == null) throw new ArgumentNullException("binaryAttribute"); Contract.EndContractBlock(); m_con = con; m_binaryAttribute = binaryAttribute; } public CustAttr(CustomAttributeBuilder customBuilder) { if (customBuilder == null) throw new ArgumentNullException("customBuilder"); Contract.EndContractBlock(); m_customBuilder = customBuilder; } [System.Security.SecurityCritical] // auto-generated public void Bake(ModuleBuilder module, int token) { if (m_customBuilder == null) { TypeBuilder.DefineCustomAttribute(module, token, module.GetConstructorToken(m_con).Token, m_binaryAttribute, false, false); } else { m_customBuilder.CreateCustomAttribute(module, token); } } } #endregion #region Public Static Methods public static MethodInfo GetMethod(Type type, MethodInfo method) { if (!(type is TypeBuilder) && !(type is TypeBuilderInstantiation)) throw new ArgumentException(Environment.GetResourceString("Argument_MustBeTypeBuilder")); // The following checks establishes invariants that more simply put require type to be generic and // method to be a generic method definition declared on the generic type definition of type. // To create generic method G.M these invariants require that G .M be created by calling // this function followed by MakeGenericMethod on the resulting MethodInfo to finally get G.M . // We could also allow G .M to be created before G .M (BindGenParm followed by this method) // if we wanted to but that just complicates things so these checks are designed to prevent that scenario. if (method.IsGenericMethod && !method.IsGenericMethodDefinition) throw new ArgumentException(Environment.GetResourceString("Argument_NeedGenericMethodDefinition"), "method"); if (method.DeclaringType == null || !method.DeclaringType.IsGenericTypeDefinition) throw new ArgumentException(Environment.GetResourceString("Argument_MethodNeedGenericDeclaringType"), "method"); if (type.GetGenericTypeDefinition() != method.DeclaringType) throw new ArgumentException(Environment.GetResourceString("Argument_InvalidMethodDeclaringType"), "type"); Contract.EndContractBlock(); // The following converts from Type or TypeBuilder of G to TypeBuilderInstantiation G . These types // both logically represent the same thing. The runtime displays a similar convention by having // G .M() be encoded by a typeSpec whose parent is the typeDef for G and whose instantiation is also G . if (type.IsGenericTypeDefinition) type = type.MakeGenericType(type.GetGenericArguments()); if (!(type is TypeBuilderInstantiation)) throw new ArgumentException(Environment.GetResourceString("Argument_NeedNonGenericType"), "type"); return MethodOnTypeBuilderInstantiation.GetMethod(method, type as TypeBuilderInstantiation); } public static ConstructorInfo GetConstructor(Type type, ConstructorInfo constructor) { if (!(type is TypeBuilder) && !(type is TypeBuilderInstantiation)) throw new ArgumentException(Environment.GetResourceString("Argument_MustBeTypeBuilder")); if (!constructor.DeclaringType.IsGenericTypeDefinition) throw new ArgumentException(Environment.GetResourceString("Argument_ConstructorNeedGenericDeclaringType"), "constructor"); Contract.EndContractBlock(); if (!(type is TypeBuilderInstantiation)) throw new ArgumentException(Environment.GetResourceString("Argument_NeedNonGenericType"), "type"); // TypeBuilder G ==> TypeBuilderInstantiation G if (type is TypeBuilder && type.IsGenericTypeDefinition) type = type.MakeGenericType(type.GetGenericArguments()); if (type.GetGenericTypeDefinition() != constructor.DeclaringType) throw new ArgumentException(Environment.GetResourceString("Argument_InvalidConstructorDeclaringType"), "type"); return ConstructorOnTypeBuilderInstantiation.GetConstructor(constructor, type as TypeBuilderInstantiation); } public static FieldInfo GetField(Type type, FieldInfo field) { if (!(type is TypeBuilder) && !(type is TypeBuilderInstantiation)) throw new ArgumentException(Environment.GetResourceString("Argument_MustBeTypeBuilder")); if (!field.DeclaringType.IsGenericTypeDefinition) throw new ArgumentException(Environment.GetResourceString("Argument_FieldNeedGenericDeclaringType"), "field"); Contract.EndContractBlock(); if (!(type is TypeBuilderInstantiation)) throw new ArgumentException(Environment.GetResourceString("Argument_NeedNonGenericType"), "type"); // TypeBuilder G ==> TypeBuilderInstantiation G if (type is TypeBuilder && type.IsGenericTypeDefinition) type = type.MakeGenericType(type.GetGenericArguments()); if (type.GetGenericTypeDefinition() != field.DeclaringType) throw new ArgumentException(Environment.GetResourceString("Argument_InvalidFieldDeclaringType"), "type"); return FieldOnTypeBuilderInstantiation.GetField(field, type as TypeBuilderInstantiation); } #endregion #region Public Const public const int UnspecifiedTypeSize = 0; #endregion #region Private Static FCalls [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] private static extern void SetParentType(RuntimeModule module, int tdTypeDef, int tkParent); [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] private static extern void AddInterfaceImpl(RuntimeModule module, int tdTypeDef, int tkInterface); #endregion #region Internal Static FCalls [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] internal static extern int DefineMethod(RuntimeModule module, int tkParent, String name, byte[] signature, int sigLength, MethodAttributes attributes); [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] internal static extern int DefineMethodSpec(RuntimeModule module, int tkParent, byte[] signature, int sigLength); [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] internal static extern int DefineField(RuntimeModule module, int tkParent, String name, byte[] signature, int sigLength, FieldAttributes attributes); [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] private static extern void SetMethodIL(RuntimeModule module, int tk, bool isInitLocals, byte[] body, int bodyLength, byte[] LocalSig, int sigLength, int maxStackSize, __ExceptionInstance[] exceptions, int numExceptions, int [] tokenFixups, int numTokenFixups, int [] rvaFixups, int numRvaFixups); [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] private static extern void DefineCustomAttribute(RuntimeModule module, int tkAssociate, int tkConstructor, byte[] attr, int attrLength, bool toDisk, bool updateCompilerFlags); [System.Security.SecurityCritical] // auto-generated internal static void DefineCustomAttribute(ModuleBuilder module, int tkAssociate, int tkConstructor, byte[] attr, bool toDisk, bool updateCompilerFlags) { byte[] localAttr = null; if (attr != null) { localAttr = new byte[attr.Length]; Array.Copy(attr, localAttr, attr.Length); } DefineCustomAttribute(module.GetNativeHandle(), tkAssociate, tkConstructor, localAttr, (localAttr != null) ? localAttr.Length : 0, toDisk, updateCompilerFlags); } [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] internal static extern void SetPInvokeData(RuntimeModule module, String DllName, String name, int token, int linkFlags); [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] internal static extern int DefineProperty(RuntimeModule module, int tkParent, String name, PropertyAttributes attributes, byte[] signature, int sigLength); [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] internal static extern int DefineEvent(RuntimeModule module, int tkParent, String name, EventAttributes attributes, int tkEventType); [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] internal static extern void DefineMethodSemantics(RuntimeModule module, int tkAssociation, MethodSemanticsAttributes semantics, int tkMethod); [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] internal static extern void DefineMethodImpl(RuntimeModule module, int tkType, int tkBody, int tkDecl); [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] internal static extern void SetMethodImpl(RuntimeModule module, int tkMethod, MethodImplAttributes MethodImplAttributes); [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] internal static extern int SetParamInfo(RuntimeModule module, int tkMethod, int iSequence, ParameterAttributes iParamAttributes, String strParamName); [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] internal static extern int GetTokenFromSig(RuntimeModule module, byte[] signature, int sigLength); [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] internal static extern void SetFieldLayoutOffset(RuntimeModule module, int fdToken, int iOffset); [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] internal static extern void SetClassLayout(RuntimeModule module, int tk, PackingSize iPackingSize, int iTypeSize); [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] internal static extern void SetFieldMarshal(RuntimeModule module, int tk, byte[] ubMarshal, int ubSize); [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] private static extern unsafe void SetConstantValue(RuntimeModule module, int tk, int corType, void* pValue); [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] internal static extern void AddDeclarativeSecurity(RuntimeModule module, int parent, SecurityAction action, byte[] blob, int cb); #endregion #region Internal\Private Static Members private static bool IsPublicComType(Type type) { // Internal Helper to determine if a type should be added to ComType table. // A top level type should be added if it is Public. // A nested type should be added if the top most enclosing type is Public // and all the enclosing types are NestedPublic Type enclosingType = type.DeclaringType; if (enclosingType != null) { if (IsPublicComType(enclosingType)) { if ((type.Attributes & TypeAttributes.VisibilityMask) == TypeAttributes.NestedPublic) { return true; } } } else { if ((type.Attributes & TypeAttributes.VisibilityMask) == TypeAttributes.Public) { return true; } } return false; } [Pure] internal static bool IsTypeEqual(Type t1, Type t2) { // Maybe we are lucky that they are equal in the first place if (t1 == t2) return true; TypeBuilder tb1 = null; TypeBuilder tb2 = null; Type runtimeType1 = null; Type runtimeType2 = null; // set up the runtimeType and TypeBuilder type corresponding to t1 and t2 if (t1 is TypeBuilder) { tb1 =(TypeBuilder)t1; // This will be null if it is not baked. runtimeType1 = tb1.m_runtimeType; } else { runtimeType1 = t1; } if (t2 is TypeBuilder) { tb2 =(TypeBuilder)t2; // This will be null if it is not baked. runtimeType2 = tb2.m_runtimeType; } else { runtimeType2 = t2; } // If the type builder view is eqaul then it is equal if (tb1 != null && tb2 != null && Object.ReferenceEquals(tb1, tb2)) return true; // if the runtimetype view is eqaul than it is equal if (runtimeType1 != null && runtimeType2 != null && runtimeType1 == runtimeType2) return true; return false; } [System.Security.SecurityCritical] // auto-generated internal static unsafe void SetConstantValue(ModuleBuilder module, int tk, Type destType, Object value) { // This is a helper function that is used by ParameterBuilder, PropertyBuilder, // and FieldBuilder to validate a default value and save it in the meta-data. if (value != null) { Type type = value.GetType(); // We should allow setting a constant value on a ByRef parameter if (destType.IsByRef) destType = destType.GetElementType(); if (destType.IsEnum) { // | UnderlyingSystemType | Enum.GetUnderlyingType() | IsEnum // ----------------------------------|---------------------------|---------------------------|--------- // runtime Enum Type | self | underlying type of enum | TRUE // EnumBuilder | underlying type of enum | underlying type of enum* | TRUE // TypeBuilder of enum types** | underlying type of enum | Exception | TRUE // TypeBuilder of enum types (baked) | runtime enum type | Exception | TRUE // *: the behavior of Enum.GetUnderlyingType(EnumBuilder) might change in the future // so let's not depend on it. // **: created with System.Enum as the parent type. // The above behaviors might not be the most consistent but we have to live with them. Type underlyingType; EnumBuilder enumBldr; TypeBuilder typeBldr; if ((enumBldr = destType as EnumBuilder) != null) { underlyingType = enumBldr.UnderlyingSystemType; // The constant value supplied should match either the baked enum type or its underlying type // we don't need to compare it with the EnumBuilder itself because you can never have an object of that type if (type != enumBldr.RuntimeEnumType && type != underlyingType) throw new ArgumentException(Environment.GetResourceString("Argument_ConstantDoesntMatch")); } else if ((typeBldr = destType as TypeBuilder) != null) { underlyingType = typeBldr.m_underlyingSystemType; // The constant value supplied should match either the baked enum type or its underlying type // typeBldr.m_underlyingSystemType is null if the user hasn't created a "value__" field on the enum if (underlyingType == null || (type != typeBldr.UnderlyingSystemType && type != underlyingType)) throw new ArgumentException(Environment.GetResourceString("Argument_ConstantDoesntMatch")); } else // must be a runtime Enum Type { Contract.Assert(destType is RuntimeType, "destType is not a runtime type, an EnumBuilder, or a TypeBuilder."); underlyingType = Enum.GetUnderlyingType(destType); // The constant value supplied should match either the enum itself or its underlying type if (type != destType && type != underlyingType) throw new ArgumentException(Environment.GetResourceString("Argument_ConstantDoesntMatch")); } type = underlyingType; } else { // Note that it is non CLS compliant if destType != type. But RefEmit never guarantees CLS-Compliance. if (!destType.IsAssignableFrom(type)) throw new ArgumentException(Environment.GetResourceString("Argument_ConstantDoesntMatch")); } CorElementType corType = RuntimeTypeHandle.GetCorElementType(type.GetTypeHandleInternal().GetRuntimeType()); switch (corType) { case CorElementType.I1: case CorElementType.U1: case CorElementType.Boolean: case CorElementType.I2: case CorElementType.U2: case CorElementType.Char: case CorElementType.I4: case CorElementType.U4: case CorElementType.R4: case CorElementType.I8: case CorElementType.U8: case CorElementType.R8: fixed (byte* pData = &JitHelpers.GetPinningHelper(value).m_data) SetConstantValue(module.GetNativeHandle(), tk, (int)corType, pData); break; default: if (type == typeof(String)) { fixed (char* pString = (string)value) SetConstantValue(module.GetNativeHandle(), tk, (int)CorElementType.String, pString); } else if (type == typeof(DateTime)) { //date is a I8 representation long ticks = ((DateTime)value).Ticks; SetConstantValue(module.GetNativeHandle(), tk, (int)CorElementType.I8, &ticks); } else { throw new ArgumentException(Environment.GetResourceString("Argument_ConstantNotSupported", type.ToString())); } break; } } else { if (destType.IsValueType) throw new ArgumentException(Environment.GetResourceString("Argument_ConstantNull")); SetConstantValue(module.GetNativeHandle(), tk, (int)CorElementType.Class, null); } } #endregion #region Private Data Members internal List m_ca; private TypeToken m_tdType; private ModuleBuilder m_module; internal String m_strName; private String m_strNameSpace; private String m_strFullQualName; private Type m_typeParent; private List m_typeInterfaces; internal TypeAttributes m_iAttr; internal GenericParameterAttributes m_genParamAttributes; internal List m_listMethods; internal int m_lastTokenizedMethod; private int m_constructorCount; private int m_iTypeSize; private PackingSize m_iPackingSize; private TypeBuilder m_DeclaringType; private Type m_underlyingSystemType; // set on the underlying TypeBuilder When a user defines a literal on an EnumBuilder internal bool m_isHiddenGlobalType; internal bool m_isHiddenType; internal bool m_hasBeenCreated; internal RuntimeType m_runtimeType; private int m_genParamPos; private GenericTypeParameterBuilder[] m_inst; private bool m_bIsGenParam; private bool m_bIsGenTypeDef; private MethodBuilder m_declMeth; private TypeBuilder m_genTypeDef; #endregion #region Constructor internal TypeBuilder(string szName, int genParamPos, MethodBuilder declMeth) { Contract.Requires(declMeth != null); m_declMeth = declMeth; m_DeclaringType =m_declMeth.GetTypeBuilder(); m_module =declMeth.GetModuleBuilder(); InitAsGenericParam(szName, genParamPos); } private TypeBuilder(string szName, int genParamPos, TypeBuilder declType) { Contract.Requires(declType != null); m_DeclaringType = declType; m_module =declType.GetModuleBuilder(); InitAsGenericParam(szName, genParamPos); } private void InitAsGenericParam(string szName, int genParamPos) { m_strName = szName; m_genParamPos = genParamPos; m_bIsGenParam = true; m_bIsGenTypeDef = false; m_typeInterfaces = new List (); } [System.Security.SecurityCritical] // auto-generated internal TypeBuilder(String name, TypeAttributes attr, Type parent, Module module, PackingSize iPackingSize, int iTypeSize, TypeBuilder enclosingType) { Init(name, attr, parent, null, module, iPackingSize, iTypeSize, enclosingType); } [System.Security.SecurityCritical] // auto-generated internal TypeBuilder(String name, TypeAttributes attr, Type parent, Type[] interfaces, Module module, PackingSize iPackingSize, TypeBuilder enclosingType) { Init(name, attr, parent, interfaces, module, iPackingSize, UnspecifiedTypeSize, enclosingType); } internal TypeBuilder(ModuleBuilder module) { m_tdType = new TypeToken((int)MetadataTokenType.TypeDef); m_isHiddenGlobalType = true; m_module =(ModuleBuilder)module; m_listMethods = new List (); // No token has been created so let's initialize it to -1 // The first time we call MethodBuilder.GetToken this will incremented. m_lastTokenizedMethod = -1; } [System.Security.SecurityCritical] // auto-generated private void Init(String fullname, TypeAttributes attr, Type parent, Type[] interfaces, Module module, PackingSize iPackingSize, int iTypeSize, TypeBuilder enclosingType) { if (fullname == null) throw new ArgumentNullException("fullname"); if (fullname.Length == 0) throw new ArgumentException(Environment.GetResourceString("Argument_EmptyName"), "fullname"); if (fullname[0] == '\0') throw new ArgumentException(Environment.GetResourceString("Argument_IllegalName"), "fullname"); if (fullname.Length > 1023) throw new ArgumentException(Environment.GetResourceString("Argument_TypeNameTooLong"), "fullname"); Contract.EndContractBlock(); int i; m_bIsGenTypeDef = false; m_bIsGenParam = false; m_hasBeenCreated = false; m_runtimeType = null; m_isHiddenGlobalType = false; m_isHiddenType = false; m_module =(ModuleBuilder) module; m_DeclaringType = enclosingType; AssemblyBuilder containingAssem = m_module.ContainingAssemblyBuilder; m_underlyingSystemType = null; // used when client use TypeBuilder to define Enum // cannot have two types within the same assembly of the same name containingAssem.m_assemblyData.CheckTypeNameConflict(fullname, enclosingType); if (enclosingType != null) { // Nested Type should have nested attribute set. // If we are renumbering TypeAttributes' bit, we need to change the logic here. if (((attr & TypeAttributes.VisibilityMask) == TypeAttributes.Public) ||((attr & TypeAttributes.VisibilityMask) == TypeAttributes.NotPublic)) throw new ArgumentException(Environment.GetResourceString("Argument_BadNestedTypeFlags"), "attr"); } int[] interfaceTokens = null; if (interfaces != null) { for(i = 0; i < interfaces.Length; i++) { if (interfaces[i] == null) { // cannot contain null in the interface list throw new ArgumentNullException("interfaces"); } } interfaceTokens = new int[interfaces.Length + 1]; for(i = 0; i < interfaces.Length; i++) { interfaceTokens[i] = m_module.GetTypeTokenInternal(interfaces[i]).Token; } } int iLast = fullname.LastIndexOf('.'); if (iLast == -1 || iLast == 0) { // no name space m_strNameSpace = String.Empty; m_strName = fullname; } else { // split the name space m_strNameSpace = fullname.Substring(0, iLast); m_strName = fullname.Substring(iLast + 1); } VerifyTypeAttributes(attr); m_iAttr = attr; SetParent(parent); m_listMethods = new List (); m_lastTokenizedMethod = -1; SetInterfaces(interfaces); m_constructorCount=0; int tkParent = 0; if (m_typeParent != null) tkParent = m_module.GetTypeTokenInternal(m_typeParent).Token; int tkEnclosingType = 0; if (enclosingType != null) { tkEnclosingType = enclosingType.m_tdType.Token; } m_tdType = new TypeToken(DefineType(m_module.GetNativeHandle(), fullname, tkParent, m_iAttr, tkEnclosingType, interfaceTokens)); m_iPackingSize = iPackingSize; m_iTypeSize = iTypeSize; if ((m_iPackingSize != 0) ||(m_iTypeSize != 0)) SetClassLayout(GetModuleBuilder().GetNativeHandle(), m_tdType.Token, m_iPackingSize, m_iTypeSize); #if !FEATURE_CORECLR // If the type is public and it is contained in a assemblyBuilder, // update the public COMType list. if (IsPublicComType(this)) { if (containingAssem.IsPersistable() && m_module.IsTransient() == false) { // This will throw InvalidOperationException if the assembly has been saved // Ideally we should reject all emit operations if the assembly has been saved, // but that would be a breaking change for some. Currently you cannot define // modules and public types, but you can still define private types and global methods. containingAssem.m_assemblyData.AddPublicComType(this); } // Now add the type to the ExportedType table if (!m_module.Equals(containingAssem.ManifestModule)) containingAssem.DefineExportedTypeInMemory(this, m_module.m_moduleData.FileToken, m_tdType.Token); } #endif } #endregion #region Private Members [System.Security.SecurityCritical] // auto-generated private MethodBuilder DefinePInvokeMethodHelper( String name, String dllName, String importName, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] returnTypeRequiredCustomModifiers, Type[] returnTypeOptionalCustomModifiers, Type[] parameterTypes, Type[][] parameterTypeRequiredCustomModifiers, Type[][] parameterTypeOptionalCustomModifiers, CallingConvention nativeCallConv, CharSet nativeCharSet) { CheckContext(returnType); CheckContext(returnTypeRequiredCustomModifiers, returnTypeOptionalCustomModifiers, parameterTypes); CheckContext(parameterTypeRequiredCustomModifiers); CheckContext(parameterTypeOptionalCustomModifiers); lock(SyncRoot) { return DefinePInvokeMethodHelperNoLock(name, dllName, importName, attributes, callingConvention, returnType, returnTypeRequiredCustomModifiers, returnTypeOptionalCustomModifiers, parameterTypes, parameterTypeRequiredCustomModifiers, parameterTypeOptionalCustomModifiers, nativeCallConv, nativeCharSet); } } [System.Security.SecurityCritical] // auto-generated private MethodBuilder DefinePInvokeMethodHelperNoLock( String name, String dllName, String importName, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] returnTypeRequiredCustomModifiers, Type[] returnTypeOptionalCustomModifiers, Type[] parameterTypes, Type[][] parameterTypeRequiredCustomModifiers, Type[][] parameterTypeOptionalCustomModifiers, CallingConvention nativeCallConv, CharSet nativeCharSet) { if (name == null) throw new ArgumentNullException("name"); if (name.Length == 0) throw new ArgumentException(Environment.GetResourceString("Argument_EmptyName"), "name"); if (dllName == null) throw new ArgumentNullException("dllName"); if (dllName.Length == 0) throw new ArgumentException(Environment.GetResourceString("Argument_EmptyName"), "dllName"); if (importName == null) throw new ArgumentNullException("importName"); if (importName.Length == 0) throw new ArgumentException(Environment.GetResourceString("Argument_EmptyName"), "importName"); if ((attributes & MethodAttributes.Abstract) != 0) throw new ArgumentException(Environment.GetResourceString("Argument_BadPInvokeMethod")); Contract.EndContractBlock(); if ((m_iAttr & TypeAttributes.ClassSemanticsMask) == TypeAttributes.Interface) throw new ArgumentException(Environment.GetResourceString("Argument_BadPInvokeOnInterface")); ThrowIfCreated(); attributes = attributes | MethodAttributes.PinvokeImpl; MethodBuilder method = new MethodBuilder(name, attributes, callingConvention, returnType, returnTypeRequiredCustomModifiers, returnTypeOptionalCustomModifiers, parameterTypes, parameterTypeRequiredCustomModifiers, parameterTypeOptionalCustomModifiers, m_module, this, false); //The signature grabbing code has to be up here or the signature won't be finished //and our equals check won't work. int sigLength; byte[] sigBytes = method.GetMethodSignature().InternalGetSignature(out sigLength); if (m_listMethods.Contains(method)) { throw new ArgumentException(Environment.GetResourceString("Argument_MethodRedefined")); } m_listMethods.Add(method); MethodToken token = method.GetToken(); int linkFlags = 0; switch(nativeCallConv) { case CallingConvention.Winapi: linkFlags =(int)PInvokeMap.CallConvWinapi; break; case CallingConvention.Cdecl: linkFlags =(int)PInvokeMap.CallConvCdecl; break; case CallingConvention.StdCall: linkFlags =(int)PInvokeMap.CallConvStdcall; break; case CallingConvention.ThisCall: linkFlags =(int)PInvokeMap.CallConvThiscall; break; case CallingConvention.FastCall: linkFlags =(int)PInvokeMap.CallConvFastcall; break; } switch(nativeCharSet) { case CharSet.None: linkFlags |=(int)PInvokeMap.CharSetNotSpec; break; case CharSet.Ansi: linkFlags |=(int)PInvokeMap.CharSetAnsi; break; case CharSet.Unicode: linkFlags |=(int)PInvokeMap.CharSetUnicode; break; case CharSet.Auto: linkFlags |=(int)PInvokeMap.CharSetAuto; break; } SetPInvokeData(m_module.GetNativeHandle(), dllName, importName, token.Token, linkFlags); method.SetToken(token); return method; } [System.Security.SecurityCritical] // auto-generated private FieldBuilder DefineDataHelper(String name, byte[] data, int size, FieldAttributes attributes) { String strValueClassName; TypeBuilder valueClassType; FieldBuilder fdBuilder; TypeAttributes typeAttributes; if (name == null) throw new ArgumentNullException("name"); if (name.Length == 0) throw new ArgumentException(Environment.GetResourceString("Argument_EmptyName"), "name"); if (size <= 0 || size >= 0x003f0000) throw new ArgumentException(Environment.GetResourceString("Argument_BadSizeForData")); Contract.EndContractBlock(); ThrowIfCreated(); // form the value class name strValueClassName = ModuleBuilderData.MULTI_BYTE_VALUE_CLASS + size; // Is this already defined in this module? Type temp = m_module.FindTypeBuilderWithName(strValueClassName, false); valueClassType = temp as TypeBuilder; if (valueClassType == null) { typeAttributes = TypeAttributes.Public | TypeAttributes.ExplicitLayout | TypeAttributes.Class | TypeAttributes.Sealed | TypeAttributes.AnsiClass; // Define the backing value class valueClassType = m_module.DefineType(strValueClassName, typeAttributes, typeof(System.ValueType), PackingSize.Size1, size); valueClassType.m_isHiddenType = true; valueClassType.CreateType(); } fdBuilder = DefineField(name, valueClassType,(attributes | FieldAttributes.Static)); // now we need to set the RVA fdBuilder.SetData(data, size); return fdBuilder; } private void VerifyTypeAttributes(TypeAttributes attr) { // Verify attr consistency for Nesting or otherwise. if (DeclaringType == null) { // Not a nested class. if (((attr & TypeAttributes.VisibilityMask) != TypeAttributes.NotPublic) &&((attr & TypeAttributes.VisibilityMask) != TypeAttributes.Public)) { throw new ArgumentException(Environment.GetResourceString("Argument_BadTypeAttrNestedVisibilityOnNonNestedType")); } } else { // Nested class. if (((attr & TypeAttributes.VisibilityMask) == TypeAttributes.NotPublic) ||((attr & TypeAttributes.VisibilityMask) == TypeAttributes.Public)) { throw new ArgumentException(Environment.GetResourceString("Argument_BadTypeAttrNonNestedVisibilityNestedType")); } } // Verify that the layout mask is valid. if (((attr & TypeAttributes.LayoutMask) != TypeAttributes.AutoLayout) &&((attr & TypeAttributes.LayoutMask) != TypeAttributes.SequentialLayout) &&((attr & TypeAttributes.LayoutMask) != TypeAttributes.ExplicitLayout)) { throw new ArgumentException(Environment.GetResourceString("Argument_BadTypeAttrInvalidLayout")); } // Check if the user attempted to set any reserved bits. if ((attr & TypeAttributes.ReservedMask) != 0) { throw new ArgumentException(Environment.GetResourceString("Argument_BadTypeAttrReservedBitsSet")); } } [Pure] public bool IsCreated() { return m_hasBeenCreated; } #endregion #region FCalls [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] private extern static int DefineType(RuntimeModule module, String fullname, int tkParent, TypeAttributes attributes, int tkEnclosingType, int[] interfaceTokens); [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] private extern static int DefineGenericParam(RuntimeModule module, String name, int tkParent, GenericParameterAttributes attributes, int position, int[] constraints); [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] private static extern void TermCreateClass(RuntimeModule module, int tk, ObjectHandleOnStack type); #endregion #region Internal Methods internal void ThrowIfCreated() { if (IsCreated()) throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_TypeHasBeenCreated")); } internal object SyncRoot { get { return m_module.SyncRoot; } } internal ModuleBuilder GetModuleBuilder() { return m_module; } #endregion #region Object Overrides public override String ToString() { return TypeNameBuilder.ToString(this, TypeNameBuilder.Format.ToString); } #endregion #region MemberInfo Overrides public override Type DeclaringType { get { return m_DeclaringType; } } public override Type ReflectedType { // Return the class that was used to obtain this field. get { return m_DeclaringType; } } public override String Name { get { return m_strName; } } public override Module Module { get { return GetModuleBuilder(); } } internal int MetadataTokenInternal { get { return m_tdType.Token; } } #endregion #region Type Overrides public override Guid GUID { get { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.GUID; } } public override Object InvokeMember(String name, BindingFlags invokeAttr, Binder binder, Object target, Object[] args, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParameters) { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.InvokeMember(name, invokeAttr, binder, target, args, modifiers, culture, namedParameters); } public override Assembly Assembly { get { return m_module.Assembly; } } public override RuntimeTypeHandle TypeHandle { get { throw new NotSupportedException(Environment.GetResourceString("NotSupported_DynamicModule")); } } public override String FullName { get { if (m_strFullQualName == null) m_strFullQualName = TypeNameBuilder.ToString(this, TypeNameBuilder.Format.FullName); return m_strFullQualName; } } public override String Namespace { get { return m_strNameSpace; } } public override String AssemblyQualifiedName { get { return TypeNameBuilder.ToString(this, TypeNameBuilder.Format.AssemblyQualifiedName); } } public override Type BaseType { get{ return m_typeParent; } } protected override ConstructorInfo GetConstructorImpl(BindingFlags bindingAttr,Binder binder, CallingConventions callConvention, Type[] types,ParameterModifier[] modifiers) { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.GetConstructor(bindingAttr, binder, callConvention, types, modifiers); } [System.Runtime.InteropServices.ComVisible(true)] public override ConstructorInfo[] GetConstructors(BindingFlags bindingAttr) { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.GetConstructors(bindingAttr); } protected override MethodInfo GetMethodImpl(String name,BindingFlags bindingAttr,Binder binder, CallingConventions callConvention, Type[] types,ParameterModifier[] modifiers) { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); if (types == null) { return m_runtimeType.GetMethod(name, bindingAttr); } else { return m_runtimeType.GetMethod(name, bindingAttr, binder, callConvention, types, modifiers); } } public override MethodInfo[] GetMethods(BindingFlags bindingAttr) { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.GetMethods(bindingAttr); } public override FieldInfo GetField(String name, BindingFlags bindingAttr) { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.GetField(name, bindingAttr); } public override FieldInfo[] GetFields(BindingFlags bindingAttr) { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.GetFields(bindingAttr); } public override Type GetInterface(String name,bool ignoreCase) { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.GetInterface(name, ignoreCase); } public override Type[] GetInterfaces() { if (m_runtimeType != null) { return m_runtimeType.GetInterfaces(); } if (m_typeInterfaces == null) { return new Type[0]; } return m_typeInterfaces.ToArray(); } public override EventInfo GetEvent(String name,BindingFlags bindingAttr) { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.GetEvent(name, bindingAttr); } public override EventInfo[] GetEvents() { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.GetEvents(); } protected override PropertyInfo GetPropertyImpl(String name, BindingFlags bindingAttr, Binder binder, Type returnType, Type[] types, ParameterModifier[] modifiers) { throw new NotSupportedException(Environment.GetResourceString("NotSupported_DynamicModule")); } public override PropertyInfo[] GetProperties(BindingFlags bindingAttr) { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.GetProperties(bindingAttr); } public override Type[] GetNestedTypes(BindingFlags bindingAttr) { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.GetNestedTypes(bindingAttr); } public override Type GetNestedType(String name, BindingFlags bindingAttr) { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.GetNestedType(name,bindingAttr); } public override MemberInfo[] GetMember(String name, MemberTypes type, BindingFlags bindingAttr) { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.GetMember(name, type, bindingAttr); } [System.Runtime.InteropServices.ComVisible(true)] public override InterfaceMapping GetInterfaceMap(Type interfaceType) { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.GetInterfaceMap(interfaceType); } public override EventInfo[] GetEvents(BindingFlags bindingAttr) { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.GetEvents(bindingAttr); } public override MemberInfo[] GetMembers(BindingFlags bindingAttr) { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.GetMembers(bindingAttr); } public override bool IsAssignableFrom(Type c) { if (TypeBuilder.IsTypeEqual(c, this)) return true; Type fromRuntimeType = null; TypeBuilder fromTypeBuilder = c as TypeBuilder; if (fromTypeBuilder != null) fromRuntimeType = fromTypeBuilder.m_runtimeType; else fromRuntimeType = c; if (fromRuntimeType != null && fromRuntimeType.IsRuntimeType) { // fromType is baked. So if this type is not baked, it cannot be assignable to! if (m_runtimeType == null) return false; // since toType is also baked, delegate to the base return m_runtimeType.IsAssignableFrom(fromRuntimeType); } // So if c is not a runtimeType nor TypeBuilder. We don't know how to deal with it. // return false then. if (fromTypeBuilder == null) return false; // If fromTypeBuilder is a subclass of this class, then c can be cast to this type. if (fromTypeBuilder.IsSubclassOf(this)) return true; if (this.IsInterface == false) return false; // now is This type a base type on one of the interface impl? Type[] interfaces = fromTypeBuilder.GetInterfaces(); for(int i = 0; i < interfaces.Length; i++) { // unfortunately, IsSubclassOf does not cover the case when they are the same type. if (TypeBuilder.IsTypeEqual(interfaces[i], this)) return true; if (interfaces[i].IsSubclassOf(this)) return true; } return false; } protected override TypeAttributes GetAttributeFlagsImpl() { return m_iAttr; } protected override bool IsArrayImpl() { return false; } protected override bool IsByRefImpl() { return false; } protected override bool IsPointerImpl() { return false; } protected override bool IsPrimitiveImpl() { return false; } protected override bool IsCOMObjectImpl() { return((GetAttributeFlagsImpl() & TypeAttributes.Import) != 0) ? true : false; } public override Type GetElementType() { // You will never have to deal with a TypeBuilder if you are just referring to arrays. throw new NotSupportedException(Environment.GetResourceString("NotSupported_DynamicModule")); } protected override bool HasElementTypeImpl() { return false; } public override bool IsSecurityCritical { get { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.IsSecurityCritical; } } public override bool IsSecuritySafeCritical { get { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.IsSecuritySafeCritical; } } public override bool IsSecurityTransparent { get { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.IsSecurityTransparent; } } [System.Runtime.InteropServices.ComVisible(true)] [Pure] public override bool IsSubclassOf(Type c) { Type p = this; if (TypeBuilder.IsTypeEqual(p, c)) return false; p = p.BaseType; while(p != null) { if (TypeBuilder.IsTypeEqual(p, c)) return true; p = p.BaseType; } return false; } public override Type UnderlyingSystemType { get { if (m_runtimeType != null) return m_runtimeType.UnderlyingSystemType; if (!IsEnum) return this; if (m_underlyingSystemType == null) throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_NoUnderlyingTypeOnEnum")); return m_underlyingSystemType; } } public override Type MakePointerType() { return SymbolType.FormCompoundType("*".ToCharArray(), this, 0); } public override Type MakeByRefType() { return SymbolType.FormCompoundType("&".ToCharArray(), this, 0); } public override Type MakeArrayType() { return SymbolType.FormCompoundType("[]".ToCharArray(), this, 0); } public override Type MakeArrayType(int rank) { if (rank <= 0) throw new IndexOutOfRangeException(); Contract.EndContractBlock(); string szrank = ""; if (rank == 1) { szrank = "*"; } else { for(int i = 1; i < rank; i++) szrank += ","; } string s = String.Format(CultureInfo.InvariantCulture, "[{0}]", szrank); // [,,] return SymbolType.FormCompoundType((s).ToCharArray(), this, 0); } #endregion #region ICustomAttributeProvider Implementation [System.Security.SecuritySafeCritical] // auto-generated public override Object[] GetCustomAttributes(bool inherit) { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return CustomAttribute.GetCustomAttributes(m_runtimeType, typeof(object) as RuntimeType, inherit); } [System.Security.SecuritySafeCritical] // auto-generated public override Object[] GetCustomAttributes(Type attributeType, bool inherit) { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); if (attributeType == null) throw new ArgumentNullException("attributeType"); Contract.EndContractBlock(); RuntimeType attributeRuntimeType = attributeType.UnderlyingSystemType as RuntimeType; if (attributeRuntimeType == null) throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"),"attributeType"); return CustomAttribute.GetCustomAttributes(m_runtimeType, attributeRuntimeType, inherit); } [System.Security.SecuritySafeCritical] // auto-generated public override bool IsDefined(Type attributeType, bool inherit) { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); if (attributeType == null) throw new ArgumentNullException("attributeType"); Contract.EndContractBlock(); RuntimeType attributeRuntimeType = attributeType.UnderlyingSystemType as RuntimeType; if (attributeRuntimeType == null) throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"),"caType"); return CustomAttribute.IsDefined(m_runtimeType, attributeRuntimeType, inherit); } #endregion #region Public Member #region DefineType internal void ThrowIfGeneric() { if (IsGenericType && !IsGenericTypeDefinition) throw new InvalidOperationException(); } public override GenericParameterAttributes GenericParameterAttributes { get { return m_genParamAttributes; } } internal void SetInterfaces(params Type[] interfaces) { ThrowIfCreated(); m_typeInterfaces = new List (); if (interfaces != null) { m_typeInterfaces.AddRange(interfaces); } } public GenericTypeParameterBuilder[] DefineGenericParameters(params string[] names) { if (names == null) throw new ArgumentNullException("names"); if (names.Length == 0) throw new ArgumentException(); Contract.EndContractBlock(); for (int i = 0; i < names.Length; i ++) if (names[i] == null) throw new ArgumentNullException("names"); if (m_inst != null) throw new InvalidOperationException(); m_bIsGenTypeDef = true; m_inst = new GenericTypeParameterBuilder[names.Length]; for(int i = 0; i < names.Length; i ++) m_inst[i] = new GenericTypeParameterBuilder(new TypeBuilder(names[i], i, this)); return m_inst; } [System.Security.SecuritySafeCritical] // auto-generated public override Type MakeGenericType(params Type[] typeArguments) { CheckContext(typeArguments); return TypeBuilderInstantiation.MakeGenericType(this, typeArguments); } public override Type[] GetGenericArguments() { return m_inst; } public override bool IsGenericTypeDefinition { get { return m_bIsGenTypeDef; } } public override bool IsGenericType { get { return m_inst != null; } } public override bool IsGenericParameter { get { return m_bIsGenParam; } } public override int GenericParameterPosition { get { return m_genParamPos; } } public override MethodBase DeclaringMethod { get { return m_declMeth; } } public override Type GetGenericTypeDefinition() { if (IsGenericTypeDefinition) return this; if (m_genTypeDef == null) throw new InvalidOperationException(); return m_genTypeDef; } #endregion #region Define Method [System.Security.SecuritySafeCritical] // auto-generated public void DefineMethodOverride(MethodInfo methodInfoBody, MethodInfo methodInfoDeclaration) { lock(SyncRoot) { DefineMethodOverrideNoLock(methodInfoBody, methodInfoDeclaration); } } [System.Security.SecurityCritical] // auto-generated private void DefineMethodOverrideNoLock(MethodInfo methodInfoBody, MethodInfo methodInfoDeclaration) { if (methodInfoBody == null) throw new ArgumentNullException("methodInfoBody"); if (methodInfoDeclaration == null) throw new ArgumentNullException("methodInfoDeclaration"); Contract.EndContractBlock(); ThrowIfGeneric(); ThrowIfCreated(); if (!object.ReferenceEquals(methodInfoBody.DeclaringType, this)) // Loader restriction: body method has to be from this class throw new ArgumentException(Environment.GetResourceString("ArgumentException_BadMethodImplBody")); MethodToken tkBody; MethodToken tkDecl; tkBody = m_module.GetMethodTokenInternal(methodInfoBody); tkDecl = m_module.GetMethodTokenInternal(methodInfoDeclaration); DefineMethodImpl(m_module.GetNativeHandle(), m_tdType.Token, tkBody.Token, tkDecl.Token); } public MethodBuilder DefineMethod(String name, MethodAttributes attributes, Type returnType, Type[] parameterTypes) { return DefineMethod(name, attributes, CallingConventions.Standard, returnType, parameterTypes); } public MethodBuilder DefineMethod(String name, MethodAttributes attributes) { return DefineMethod(name, attributes, CallingConventions.Standard, null, null); } public MethodBuilder DefineMethod(String name, MethodAttributes attributes, CallingConventions callingConvention) { return DefineMethod(name, attributes, callingConvention, null, null); } public MethodBuilder DefineMethod(String name, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] parameterTypes) { return DefineMethod(name, attributes, callingConvention, returnType, null, null, parameterTypes, null, null); } [System.Security.SecuritySafeCritical] // auto-generated public MethodBuilder DefineMethod(String name, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] returnTypeRequiredCustomModifiers, Type[] returnTypeOptionalCustomModifiers, Type[] parameterTypes, Type[][] parameterTypeRequiredCustomModifiers, Type[][] parameterTypeOptionalCustomModifiers) { lock(SyncRoot) { return DefineMethodNoLock(name, attributes, callingConvention, returnType, returnTypeRequiredCustomModifiers, returnTypeOptionalCustomModifiers, parameterTypes, parameterTypeRequiredCustomModifiers, parameterTypeOptionalCustomModifiers); } } private MethodBuilder DefineMethodNoLock(String name, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] returnTypeRequiredCustomModifiers, Type[] returnTypeOptionalCustomModifiers, Type[] parameterTypes, Type[][] parameterTypeRequiredCustomModifiers, Type[][] parameterTypeOptionalCustomModifiers) { if (name == null) throw new ArgumentNullException("name"); if (name.Length == 0) throw new ArgumentException(Environment.GetResourceString("Argument_EmptyName"), "name"); Contract.EndContractBlock(); CheckContext(returnType); CheckContext(returnTypeRequiredCustomModifiers, returnTypeOptionalCustomModifiers, parameterTypes); CheckContext(parameterTypeRequiredCustomModifiers); CheckContext(parameterTypeOptionalCustomModifiers); if (parameterTypes != null) { if (parameterTypeOptionalCustomModifiers != null && parameterTypeOptionalCustomModifiers.Length != parameterTypes.Length) throw new ArgumentException(Environment.GetResourceString("Argument_MismatchedArrays", "parameterTypeOptionalCustomModifiers", "parameterTypes")); if (parameterTypeRequiredCustomModifiers != null && parameterTypeRequiredCustomModifiers.Length != parameterTypes.Length) throw new ArgumentException(Environment.GetResourceString("Argument_MismatchedArrays", "parameterTypeRequiredCustomModifiers", "parameterTypes")); } ThrowIfGeneric(); ThrowIfCreated(); if (!m_isHiddenGlobalType) { if (((m_iAttr & TypeAttributes.ClassSemanticsMask) == TypeAttributes.Interface) && (attributes & MethodAttributes.Abstract) == 0 &&(attributes & MethodAttributes.Static) == 0) throw new ArgumentException(Environment.GetResourceString("Argument_BadAttributeOnInterfaceMethod")); } // pass in Method attributes MethodBuilder method = new MethodBuilder( name, attributes, callingConvention, returnType, returnTypeRequiredCustomModifiers, returnTypeOptionalCustomModifiers, parameterTypes, parameterTypeRequiredCustomModifiers, parameterTypeOptionalCustomModifiers, m_module, this, false); if (!m_isHiddenGlobalType) { //If this method is declared to be a constructor, increment our constructor count. if ((method.Attributes & MethodAttributes.SpecialName) != 0 && method.Name.Equals(ConstructorInfo.ConstructorName)) { m_constructorCount++; } } m_listMethods.Add(method); return method; } #endregion #region Define Constructor [System.Security.SecuritySafeCritical] // auto-generated [System.Runtime.InteropServices.ComVisible(true)] public ConstructorBuilder DefineTypeInitializer() { lock(SyncRoot) { return DefineTypeInitializerNoLock(); } } [System.Security.SecurityCritical] // auto-generated private ConstructorBuilder DefineTypeInitializerNoLock() { ThrowIfGeneric(); ThrowIfCreated(); // change the attributes and the class constructor's name MethodAttributes attr = MethodAttributes.Private | MethodAttributes.Static | MethodAttributes.SpecialName; ConstructorBuilder constBuilder = new ConstructorBuilder( ConstructorInfo.TypeConstructorName, attr, CallingConventions.Standard, null, m_module, this); return constBuilder; } [System.Security.SecuritySafeCritical] // auto-generated [System.Runtime.InteropServices.ComVisible(true)] public ConstructorBuilder DefineDefaultConstructor(MethodAttributes attributes) { if ((m_iAttr & TypeAttributes.Interface) == TypeAttributes.Interface) { throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_ConstructorNotAllowedOnInterface")); } lock(SyncRoot) { return DefineDefaultConstructorNoLock(attributes); } } private ConstructorBuilder DefineDefaultConstructorNoLock(MethodAttributes attributes) { ThrowIfGeneric(); ConstructorBuilder constBuilder; // get the parent class's default constructor // We really don't want(BindingFlags.Instance|BindingFlags.Public|BindingFlags.NonPublic) here. We really want // constructors visible from the subclass, but that is not currently // available in BindingFlags. This more open binding is open to // runtime binding failures(like if we resolve to a private // constructor). ConstructorInfo con = null; if (m_typeParent is TypeBuilderInstantiation) { Type genericTypeDefinition = m_typeParent.GetGenericTypeDefinition(); if (genericTypeDefinition is TypeBuilder) genericTypeDefinition = ((TypeBuilder)genericTypeDefinition).m_runtimeType; if (genericTypeDefinition == null) throw new NotSupportedException(Environment.GetResourceString("NotSupported_DynamicModule")); Type inst = genericTypeDefinition.MakeGenericType(m_typeParent.GetGenericArguments()); if (inst is TypeBuilderInstantiation) con = TypeBuilder.GetConstructor(inst, genericTypeDefinition.GetConstructor( BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, Type.EmptyTypes, null)); else con = inst.GetConstructor( BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, Type.EmptyTypes, null); } if (con == null) { con = m_typeParent.GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, Type.EmptyTypes, null); } if (con == null) throw new NotSupportedException(Environment.GetResourceString("NotSupported_NoParentDefaultConstructor")); // Define the constructor Builder constBuilder = DefineConstructor(attributes, CallingConventions.Standard, null); m_constructorCount++; // generate the code to call the parent's default constructor ILGenerator il = constBuilder.GetILGenerator(); il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Call,con); il.Emit(OpCodes.Ret); constBuilder.m_ReturnILGen = false; return constBuilder; } [System.Runtime.InteropServices.ComVisible(true)] public ConstructorBuilder DefineConstructor(MethodAttributes attributes, CallingConventions callingConvention, Type[] parameterTypes) { return DefineConstructor(attributes, callingConvention, parameterTypes, null, null); } [System.Security.SecuritySafeCritical] // auto-generated [System.Runtime.InteropServices.ComVisible(true)] public ConstructorBuilder DefineConstructor(MethodAttributes attributes, CallingConventions callingConvention, Type[] parameterTypes, Type[][] requiredCustomModifiers, Type[][] optionalCustomModifiers) { if ((m_iAttr & TypeAttributes.Interface) == TypeAttributes.Interface && (attributes & MethodAttributes.Static) != MethodAttributes.Static) { throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_ConstructorNotAllowedOnInterface")); } lock(SyncRoot) { return DefineConstructorNoLock(attributes, callingConvention, parameterTypes, requiredCustomModifiers, optionalCustomModifiers); } } [System.Security.SecurityCritical] // auto-generated private ConstructorBuilder DefineConstructorNoLock(MethodAttributes attributes, CallingConventions callingConvention, Type[] parameterTypes, Type[][] requiredCustomModifiers, Type[][] optionalCustomModifiers) { CheckContext(parameterTypes); CheckContext(requiredCustomModifiers); CheckContext(optionalCustomModifiers); ThrowIfGeneric(); ThrowIfCreated(); String name; if ((attributes & MethodAttributes.Static) == 0) { name = ConstructorInfo.ConstructorName; } else { name = ConstructorInfo.TypeConstructorName; } attributes = attributes | MethodAttributes.SpecialName; ConstructorBuilder constBuilder = new ConstructorBuilder(name, attributes, callingConvention, parameterTypes, requiredCustomModifiers, optionalCustomModifiers, m_module, this); m_constructorCount++; return constBuilder; } #endregion #region Define PInvoke [System.Security.SecuritySafeCritical] // auto-generated public MethodBuilder DefinePInvokeMethod(String name, String dllName, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] parameterTypes, CallingConvention nativeCallConv, CharSet nativeCharSet) { ThrowIfGeneric(); MethodBuilder method = DefinePInvokeMethodHelper( name, dllName, name, attributes, callingConvention, returnType, null, null, parameterTypes, null, null, nativeCallConv, nativeCharSet); return method; } [System.Security.SecuritySafeCritical] // auto-generated public MethodBuilder DefinePInvokeMethod(String name, String dllName, String entryName, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] parameterTypes, CallingConvention nativeCallConv, CharSet nativeCharSet) { MethodBuilder method = DefinePInvokeMethodHelper( name, dllName, entryName, attributes, callingConvention, returnType, null, null, parameterTypes, null, null, nativeCallConv, nativeCharSet); return method; } [System.Security.SecuritySafeCritical] // auto-generated public MethodBuilder DefinePInvokeMethod(String name, String dllName, String entryName, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] returnTypeRequiredCustomModifiers, Type[] returnTypeOptionalCustomModifiers, Type[] parameterTypes, Type[][] parameterTypeRequiredCustomModifiers, Type[][] parameterTypeOptionalCustomModifiers, CallingConvention nativeCallConv, CharSet nativeCharSet) { ThrowIfGeneric(); MethodBuilder method = DefinePInvokeMethodHelper( name, dllName, entryName, attributes, callingConvention, returnType, returnTypeRequiredCustomModifiers, returnTypeOptionalCustomModifiers, parameterTypes, parameterTypeRequiredCustomModifiers, parameterTypeOptionalCustomModifiers, nativeCallConv, nativeCharSet); return method; } #endregion #region Define Nested Type [System.Security.SecuritySafeCritical] // auto-generated public TypeBuilder DefineNestedType(String name) { lock(SyncRoot) { return DefineNestedTypeNoLock(name); } } [System.Security.SecurityCritical] // auto-generated private TypeBuilder DefineNestedTypeNoLock(String name) { ThrowIfGeneric(); TypeBuilder typeBuilder; typeBuilder = new TypeBuilder(name, TypeAttributes.NestedPrivate, null, null, m_module, PackingSize.Unspecified, this); m_module.AddType(typeBuilder); return typeBuilder; } [System.Security.SecuritySafeCritical] // auto-generated [System.Runtime.InteropServices.ComVisible(true)] public TypeBuilder DefineNestedType(String name, TypeAttributes attr, Type parent, Type[] interfaces) { lock(SyncRoot) { return DefineNestedTypeNoLock(name, attr, parent, interfaces); } } [System.Security.SecurityCritical] // auto-generated private TypeBuilder DefineNestedTypeNoLock(String name, TypeAttributes attr, Type parent, Type[] interfaces) { CheckContext(parent); CheckContext(interfaces); ThrowIfGeneric(); TypeBuilder typeBuilder; typeBuilder = new TypeBuilder(name, attr, parent, interfaces, m_module, PackingSize.Unspecified, this); m_module.AddType(typeBuilder); return typeBuilder; } [System.Security.SecuritySafeCritical] // auto-generated public TypeBuilder DefineNestedType(String name, TypeAttributes attr, Type parent) { lock(SyncRoot) { return DefineNestedTypeNoLock(name, attr, parent); } } [System.Security.SecurityCritical] // auto-generated private TypeBuilder DefineNestedTypeNoLock(String name, TypeAttributes attr, Type parent) { ThrowIfGeneric(); TypeBuilder typeBuilder; typeBuilder = new TypeBuilder(name, attr, parent, null, m_module, PackingSize.Unspecified, this); m_module.AddType(typeBuilder); return typeBuilder; } [System.Security.SecuritySafeCritical] // auto-generated public TypeBuilder DefineNestedType(String name, TypeAttributes attr) { lock(SyncRoot) { return DefineNestedTypeNoLock(name, attr); } } [System.Security.SecurityCritical] // auto-generated private TypeBuilder DefineNestedTypeNoLock(String name, TypeAttributes attr) { ThrowIfGeneric(); TypeBuilder typeBuilder; typeBuilder = new TypeBuilder(name, attr, null, null, m_module, PackingSize.Unspecified, this); m_module.AddType(typeBuilder); return typeBuilder; } [System.Security.SecuritySafeCritical] // auto-generated public TypeBuilder DefineNestedType(String name, TypeAttributes attr, Type parent, int typeSize) { lock(SyncRoot) { return DefineNestedTypeNoLock(name, attr, parent, typeSize); } } [System.Security.SecurityCritical] // auto-generated private TypeBuilder DefineNestedTypeNoLock(String name, TypeAttributes attr, Type parent, int typeSize) { TypeBuilder typeBuilder; typeBuilder = new TypeBuilder(name, attr, parent, m_module, PackingSize.Unspecified, typeSize, this); m_module.AddType(typeBuilder); return typeBuilder; } [System.Security.SecuritySafeCritical] // auto-generated public TypeBuilder DefineNestedType(String name, TypeAttributes attr, Type parent, PackingSize packSize) { lock(SyncRoot) { return DefineNestedTypeNoLock(name, attr, parent, packSize); } } [System.Security.SecurityCritical] // auto-generated private TypeBuilder DefineNestedTypeNoLock(String name, TypeAttributes attr, Type parent, PackingSize packSize) { ThrowIfGeneric(); TypeBuilder typeBuilder; typeBuilder = new TypeBuilder(name, attr, parent, null, m_module, packSize, this); m_module.AddType(typeBuilder); return typeBuilder; } #endregion #region Define Field public FieldBuilder DefineField(String fieldName, Type type, FieldAttributes attributes) { return DefineField(fieldName, type, null, null, attributes); } [System.Security.SecuritySafeCritical] // auto-generated public FieldBuilder DefineField(String fieldName, Type type, Type[] requiredCustomModifiers, Type[] optionalCustomModifiers, FieldAttributes attributes) { lock(SyncRoot) { return DefineFieldNoLock(fieldName, type, requiredCustomModifiers, optionalCustomModifiers, attributes); } } [System.Security.SecurityCritical] // auto-generated private FieldBuilder DefineFieldNoLock(String fieldName, Type type, Type[] requiredCustomModifiers, Type[] optionalCustomModifiers, FieldAttributes attributes) { ThrowIfGeneric(); ThrowIfCreated(); CheckContext(type); CheckContext(requiredCustomModifiers); if (m_underlyingSystemType == null && IsEnum == true) { if ((attributes & FieldAttributes.Static) == 0) { // remember the underlying type for enum type m_underlyingSystemType = type; } } return new FieldBuilder(this, fieldName, type, requiredCustomModifiers, optionalCustomModifiers, attributes); } [System.Security.SecuritySafeCritical] // auto-generated public FieldBuilder DefineInitializedData(String name, byte[] data, FieldAttributes attributes) { lock(SyncRoot) { return DefineInitializedDataNoLock(name, data, attributes); } } [System.Security.SecurityCritical] // auto-generated private FieldBuilder DefineInitializedDataNoLock(String name, byte[] data, FieldAttributes attributes) { if (data == null) throw new ArgumentNullException("data"); Contract.EndContractBlock(); // This method will define an initialized Data in .sdata. // We will create a fake TypeDef to represent the data with size. This TypeDef // will be the signature for the Field. ThrowIfGeneric(); return DefineDataHelper(name, data, data.Length, attributes); } [System.Security.SecuritySafeCritical] // auto-generated public FieldBuilder DefineUninitializedData(String name, int size, FieldAttributes attributes) { lock(SyncRoot) { return DefineUninitializedDataNoLock(name, size, attributes); } } [System.Security.SecurityCritical] // auto-generated private FieldBuilder DefineUninitializedDataNoLock(String name, int size, FieldAttributes attributes) { // This method will define an uninitialized Data in .sdata. // We will create a fake TypeDef to represent the data with size. This TypeDef // will be the signature for the Field. ThrowIfGeneric(); return DefineDataHelper(name, null, size, attributes); } #endregion #region Define Properties and Events public PropertyBuilder DefineProperty(String name, PropertyAttributes attributes, Type returnType, Type[] parameterTypes) { return DefineProperty(name, attributes, returnType, null, null, parameterTypes, null, null); } [System.Security.SecuritySafeCritical] // auto-generated public PropertyBuilder DefineProperty(String name, PropertyAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] parameterTypes) { return DefineProperty(name, attributes, callingConvention, returnType, null, null, parameterTypes, null, null); } [System.Security.SecuritySafeCritical] // auto-generated public PropertyBuilder DefineProperty(String name, PropertyAttributes attributes, Type returnType, Type[] returnTypeRequiredCustomModifiers, Type[] returnTypeOptionalCustomModifiers, Type[] parameterTypes, Type[][] parameterTypeRequiredCustomModifiers, Type[][] parameterTypeOptionalCustomModifiers) { return DefineProperty(name, attributes, (CallingConventions)0, returnType, returnTypeRequiredCustomModifiers, returnTypeOptionalCustomModifiers, parameterTypes, parameterTypeRequiredCustomModifiers, parameterTypeOptionalCustomModifiers); } [System.Security.SecuritySafeCritical] // auto-generated public PropertyBuilder DefineProperty(String name, PropertyAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] returnTypeRequiredCustomModifiers, Type[] returnTypeOptionalCustomModifiers, Type[] parameterTypes, Type[][] parameterTypeRequiredCustomModifiers, Type[][] parameterTypeOptionalCustomModifiers) { lock(SyncRoot) { return DefinePropertyNoLock(name, attributes, callingConvention, returnType, returnTypeRequiredCustomModifiers, returnTypeOptionalCustomModifiers, parameterTypes, parameterTypeRequiredCustomModifiers, parameterTypeOptionalCustomModifiers); } } [System.Security.SecurityCritical] // auto-generated private PropertyBuilder DefinePropertyNoLock(String name, PropertyAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] returnTypeRequiredCustomModifiers, Type[] returnTypeOptionalCustomModifiers, Type[] parameterTypes, Type[][] parameterTypeRequiredCustomModifiers, Type[][] parameterTypeOptionalCustomModifiers) { if (name == null) throw new ArgumentNullException("name"); if (name.Length == 0) throw new ArgumentException(Environment.GetResourceString("Argument_EmptyName"), "name"); Contract.EndContractBlock(); ThrowIfGeneric(); CheckContext(returnType); CheckContext(returnTypeRequiredCustomModifiers, returnTypeOptionalCustomModifiers, parameterTypes); CheckContext(parameterTypeRequiredCustomModifiers); CheckContext(parameterTypeOptionalCustomModifiers); SignatureHelper sigHelper; int sigLength; byte[] sigBytes; ThrowIfCreated(); // get the signature in SignatureHelper form sigHelper = SignatureHelper.GetPropertySigHelper( m_module, callingConvention, returnType, returnTypeRequiredCustomModifiers, returnTypeOptionalCustomModifiers, parameterTypes, parameterTypeRequiredCustomModifiers, parameterTypeOptionalCustomModifiers); // get the signature in byte form sigBytes = sigHelper.InternalGetSignature(out sigLength); PropertyToken prToken = new PropertyToken(DefineProperty( m_module.GetNativeHandle(), m_tdType.Token, name, attributes, sigBytes, sigLength)); // create the property builder now. return new PropertyBuilder( m_module, name, sigHelper, attributes, returnType, prToken, this); } [System.Security.SecuritySafeCritical] // auto-generated public EventBuilder DefineEvent(String name, EventAttributes attributes, Type eventtype) { lock(SyncRoot) { return DefineEventNoLock(name, attributes, eventtype); } } [System.Security.SecurityCritical] // auto-generated private EventBuilder DefineEventNoLock(String name, EventAttributes attributes, Type eventtype) { if (name == null) throw new ArgumentNullException("name"); if (name.Length == 0) throw new ArgumentException(Environment.GetResourceString("Argument_EmptyName"), "name"); if (name[0] == '\0') throw new ArgumentException(Environment.GetResourceString("Argument_IllegalName"), "name"); Contract.EndContractBlock(); int tkType; EventToken evToken; CheckContext(eventtype); ThrowIfGeneric(); ThrowIfCreated(); tkType = m_module.GetTypeTokenInternal( eventtype ).Token; // Internal helpers to define property records evToken = new EventToken(DefineEvent( m_module.GetNativeHandle(), m_tdType.Token, name, attributes, tkType)); // create the property builder now. return new EventBuilder( m_module, name, attributes, //tkType, this, evToken); } #endregion #region Create Type [System.Security.SecuritySafeCritical] // auto-generated public Type CreateType() { lock(SyncRoot) { return CreateTypeNoLock(); } } internal void CheckContext(params Type[][] typess) { m_module.CheckContext(typess); } internal void CheckContext(params Type[] types) { m_module.CheckContext(types); } [System.Security.SecurityCritical] // auto-generated private Type CreateTypeNoLock() { if (IsCreated()) return m_runtimeType; ThrowIfGeneric(); ThrowIfCreated(); if (m_typeInterfaces == null) m_typeInterfaces = new List (); int[] interfaceTokens = new int[m_typeInterfaces.Count]; for(int i = 0; i < m_typeInterfaces.Count; i++) { interfaceTokens[i] = m_module.GetTypeTokenInternal(m_typeInterfaces[i]).Token; } int tkParent = 0; if (m_typeParent != null) tkParent = m_module.GetTypeTokenInternal(m_typeParent).Token; if (IsGenericParameter) { int[] constraints; // Array of token constrains terminated by null token if (m_typeParent != null) { constraints = new int[m_typeInterfaces.Count + 2]; constraints[constraints.Length - 2] = tkParent; } else { constraints = new int[m_typeInterfaces.Count + 1]; } for (int i = 0; i < m_typeInterfaces.Count; i++) { constraints[i] = m_module.GetTypeTokenInternal(m_typeInterfaces[i]).Token; } int declMember = m_declMeth == null ? m_DeclaringType.m_tdType.Token : m_declMeth.GetToken().Token; m_tdType = new TypeToken(DefineGenericParam(m_module.GetNativeHandle(), m_strName, declMember, m_genParamAttributes, m_genParamPos, constraints)); if (m_ca != null) { foreach (CustAttr ca in m_ca) ca.Bake(m_module, MetadataTokenInternal); } m_hasBeenCreated = true; return this; } else { // Check for global typebuilder if (((m_tdType.Token & 0x00FFFFFF) != 0) && ((tkParent & 0x00FFFFFF) != 0)) SetParentType(m_module.GetNativeHandle(), m_tdType.Token, tkParent); if (m_inst != null) foreach (Type tb in m_inst) if (tb is GenericTypeParameterBuilder) ((GenericTypeParameterBuilder)tb).m_type.CreateType(); } byte [] body; MethodAttributes methodAttrs; int maxstack; if (!m_isHiddenGlobalType) { // create a public default constructor if this class has no constructor. // except if the type is Interface, ValueType, Enum, or a static class. if (m_constructorCount == 0 && ((m_iAttr & TypeAttributes.Interface) == 0) && !IsValueType && ((m_iAttr & (TypeAttributes.Abstract | TypeAttributes.Sealed)) != (TypeAttributes.Abstract | TypeAttributes.Sealed))) { DefineDefaultConstructor(MethodAttributes.Public); } } int size = m_listMethods.Count; for(int i = 0; i < size; i++) { MethodBuilder meth = m_listMethods[i]; if (meth.IsGenericMethodDefinition) meth.GetToken(); // Doubles as "CreateMethod" for MethodBuilder -- analagous to CreateType() methodAttrs = meth.Attributes; // Any of these flags in the implemenation flags is set, we will not attach the IL method body if (((meth.GetMethodImplementationFlags() &(MethodImplAttributes.CodeTypeMask|MethodImplAttributes.PreserveSig|MethodImplAttributes.Unmanaged)) != MethodImplAttributes.IL) || ((methodAttrs & MethodAttributes.PinvokeImpl) !=(MethodAttributes) 0)) { continue; } int sigLength; byte[] localSig= meth.GetLocalsSignature().InternalGetSignature(out sigLength); // Check that they haven't declared an abstract method on a non-abstract class if (((methodAttrs & MethodAttributes.Abstract) != 0) &&((m_iAttr & TypeAttributes.Abstract) == 0)) { throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_BadTypeAttributesNotAbstract")); } body = meth.GetBody(); // If this is an abstract method or an interface, we don't need to set the IL. if ((methodAttrs & MethodAttributes.Abstract) != 0) { // We won't check on Interface because we can have class static initializer on interface. // We will just let EE or validator to catch the problem. //((m_iAttr & TypeAttributes.ClassSemanticsMask) == TypeAttributes.Interface)) if (body != null) throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_BadMethodBody")); } else if (body == null || body.Length == 0) { // If it's not an abstract or an interface, set the IL. if (meth.m_ilGenerator != null) { // we need to bake the method here. meth.CreateMethodBodyHelper(meth.GetILGenerator()); } body = meth.GetBody(); if ((body == null || body.Length == 0) && !meth.m_canBeRuntimeImpl) throw new InvalidOperationException( Environment.GetResourceString("InvalidOperation_BadEmptyMethodBody", meth.Name) ); } if (meth.m_ilGenerator != null) { maxstack = meth.m_ilGenerator.GetMaxStackSize() + meth.GetNumberOfExceptions(); } else { // this is the case when client provide an array of IL byte stream rather than going through ILGenerator. maxstack = 16; } __ExceptionInstance[] Exceptions = meth.GetExceptionInstances(); int[] TokenFixups = meth.GetTokenFixups(); int[] RVAFixups = meth.GetRVAFixups(); SetMethodIL(m_module.GetNativeHandle(), meth.GetToken().Token, meth.InitLocals, body, (body != null) ? body.Length : 0, localSig, sigLength, maxstack, Exceptions, (Exceptions != null) ? Exceptions.Length : 0, TokenFixups, (TokenFixups != null) ? TokenFixups.Length : 0, RVAFixups, (RVAFixups != null) ? RVAFixups.Length : 0); if (m_module.ContainingAssemblyBuilder.m_assemblyData.m_access == AssemblyBuilderAccess.Run) { // if we don't need the data structures to build the method any more // throw them away. meth.ReleaseBakedStructures(); } } m_hasBeenCreated = true; // Terminate the process. RuntimeType cls = null; TermCreateClass(m_module.GetNativeHandle(), m_tdType.Token, JitHelpers.GetObjectHandleOnStack(ref cls)); if (!m_isHiddenGlobalType) { m_runtimeType = cls; // if this type is a nested type, we need to invalidate the cached nested runtime type on the nesting type if (m_DeclaringType != null && m_DeclaringType.m_runtimeType != null) { ((RuntimeType)m_DeclaringType.m_runtimeType).InvalidateCachedNestedType(); } return cls; } else { return null; } } #endregion #region Misc public int Size { get { return m_iTypeSize; } } public PackingSize PackingSize { get { return m_iPackingSize; } } [System.Security.SecuritySafeCritical] // auto-generated public void SetParent(Type parent) { ThrowIfGeneric(); ThrowIfCreated(); if (parent != null) { CheckContext(parent); if (parent.IsInterface) throw new ArgumentException(Environment.GetResourceString("Argument_CannotSetParentToInterface")); m_typeParent = parent; } else { if ((m_iAttr & TypeAttributes.Interface) != TypeAttributes.Interface) { m_typeParent = typeof(Object); } else { if ((m_iAttr & TypeAttributes.Abstract) == 0) throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_BadInterfaceNotAbstract")); // there is no extends for interface class m_typeParent = null; } } } [System.Security.SecuritySafeCritical] // auto-generated [System.Runtime.InteropServices.ComVisible(true)] public void AddInterfaceImplementation(Type interfaceType) { if (interfaceType == null) { throw new ArgumentNullException("interfaceType"); } Contract.EndContractBlock(); ThrowIfGeneric(); CheckContext(interfaceType); ThrowIfCreated(); TypeToken tkInterface = m_module.GetTypeTokenInternal(interfaceType); AddInterfaceImpl(m_module.GetNativeHandle(), m_tdType.Token, tkInterface.Token); m_typeInterfaces.Add(interfaceType); } #if FEATURE_CAS_POLICY [System.Security.SecuritySafeCritical] // auto-generated public void AddDeclarativeSecurity(SecurityAction action, PermissionSet pset) { lock(SyncRoot) { AddDeclarativeSecurityNoLock(action, pset); } } [System.Security.SecurityCritical] // auto-generated private void AddDeclarativeSecurityNoLock(SecurityAction action, PermissionSet pset) { if (pset == null) throw new ArgumentNullException("pset"); #pragma warning disable 618 if (!Enum.IsDefined(typeof(SecurityAction), action) || action == SecurityAction.RequestMinimum || action == SecurityAction.RequestOptional || action == SecurityAction.RequestRefuse) { throw new ArgumentOutOfRangeException("action"); } #pragma warning restore 618 Contract.EndContractBlock(); ThrowIfGeneric(); ThrowIfCreated(); // Translate permission set into serialized format(uses standard binary serialization format). byte[] blob = null; int length = 0; if (!pset.IsEmpty()) { blob = pset.EncodeXml(); length = blob.Length; } // Write the blob into the metadata. AddDeclarativeSecurity(m_module.GetNativeHandle(), m_tdType.Token, action, blob, length); } #endif // FEATURE_CAS_POLICY public TypeToken TypeToken { get { if (IsGenericParameter) ThrowIfCreated(); return m_tdType; } } [System.Security.SecuritySafeCritical] // auto-generated [System.Runtime.InteropServices.ComVisible(true)] public void SetCustomAttribute(ConstructorInfo con, byte[] binaryAttribute) { if (con == null) throw new ArgumentNullException("con"); if (binaryAttribute == null) throw new ArgumentNullException("binaryAttribute"); Contract.EndContractBlock(); ThrowIfGeneric(); TypeBuilder.DefineCustomAttribute(m_module, m_tdType.Token, ((ModuleBuilder)m_module).GetConstructorToken(con).Token, binaryAttribute, false, false); } [System.Security.SecuritySafeCritical] // auto-generated public void SetCustomAttribute(CustomAttributeBuilder customBuilder) { if (customBuilder == null) throw new ArgumentNullException("customBuilder"); Contract.EndContractBlock(); ThrowIfGeneric(); customBuilder.CreateCustomAttribute((ModuleBuilder)m_module, m_tdType.Token); } #endregion #endregion void _TypeBuilder.GetTypeInfoCount(out uint pcTInfo) { throw new NotImplementedException(); } void _TypeBuilder.GetTypeInfo(uint iTInfo, uint lcid, IntPtr ppTInfo) { throw new NotImplementedException(); } void _TypeBuilder.GetIDsOfNames([In] ref Guid riid, IntPtr rgszNames, uint cNames, uint lcid, IntPtr rgDispId) { throw new NotImplementedException(); } void _TypeBuilder.Invoke(uint dispIdMember, [In] ref Guid riid, uint lcid, short wFlags, IntPtr pDispParams, IntPtr pVarResult, IntPtr pExcepInfo, IntPtr puArgErr) { throw new NotImplementedException(); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. // ==++== // // Copyright(c) Microsoft Corporation. All rights reserved. // // ==--== // [....] // namespace System.Reflection.Emit { using System; using System.Reflection; using System.Security; using System.Security.Permissions; using System.Diagnostics; using System.Runtime.InteropServices; using System.Runtime.CompilerServices; using System.Collections.Generic; using CultureInfo = System.Globalization.CultureInfo; using System.Threading; using System.Runtime.Versioning; using System.Diagnostics.Contracts; [Serializable] [System.Runtime.InteropServices.ComVisible(true)] public enum PackingSize { Unspecified = 0, Size1 = 1, Size2 = 2, Size4 = 4, Size8 = 8, Size16 = 16, Size32 = 32, Size64 = 64, Size128 = 128, } [HostProtection(MayLeakOnAbort = true)] [ClassInterface(ClassInterfaceType.None)] [ComDefaultInterface(typeof(_TypeBuilder))] [System.Runtime.InteropServices.ComVisible(true)] public sealed class TypeBuilder : Type, _TypeBuilder { #region Declarations internal class CustAttr { private ConstructorInfo m_con; private byte[] m_binaryAttribute; private CustomAttributeBuilder m_customBuilder; public CustAttr(ConstructorInfo con, byte[] binaryAttribute) { if (con == null) throw new ArgumentNullException("con"); if (binaryAttribute == null) throw new ArgumentNullException("binaryAttribute"); Contract.EndContractBlock(); m_con = con; m_binaryAttribute = binaryAttribute; } public CustAttr(CustomAttributeBuilder customBuilder) { if (customBuilder == null) throw new ArgumentNullException("customBuilder"); Contract.EndContractBlock(); m_customBuilder = customBuilder; } [System.Security.SecurityCritical] // auto-generated public void Bake(ModuleBuilder module, int token) { if (m_customBuilder == null) { TypeBuilder.DefineCustomAttribute(module, token, module.GetConstructorToken(m_con).Token, m_binaryAttribute, false, false); } else { m_customBuilder.CreateCustomAttribute(module, token); } } } #endregion #region Public Static Methods public static MethodInfo GetMethod(Type type, MethodInfo method) { if (!(type is TypeBuilder) && !(type is TypeBuilderInstantiation)) throw new ArgumentException(Environment.GetResourceString("Argument_MustBeTypeBuilder")); // The following checks establishes invariants that more simply put require type to be generic and // method to be a generic method definition declared on the generic type definition of type. // To create generic method G.M these invariants require that G .M be created by calling // this function followed by MakeGenericMethod on the resulting MethodInfo to finally get G.M . // We could also allow G .M to be created before G .M (BindGenParm followed by this method) // if we wanted to but that just complicates things so these checks are designed to prevent that scenario. if (method.IsGenericMethod && !method.IsGenericMethodDefinition) throw new ArgumentException(Environment.GetResourceString("Argument_NeedGenericMethodDefinition"), "method"); if (method.DeclaringType == null || !method.DeclaringType.IsGenericTypeDefinition) throw new ArgumentException(Environment.GetResourceString("Argument_MethodNeedGenericDeclaringType"), "method"); if (type.GetGenericTypeDefinition() != method.DeclaringType) throw new ArgumentException(Environment.GetResourceString("Argument_InvalidMethodDeclaringType"), "type"); Contract.EndContractBlock(); // The following converts from Type or TypeBuilder of G to TypeBuilderInstantiation G . These types // both logically represent the same thing. The runtime displays a similar convention by having // G .M() be encoded by a typeSpec whose parent is the typeDef for G and whose instantiation is also G . if (type.IsGenericTypeDefinition) type = type.MakeGenericType(type.GetGenericArguments()); if (!(type is TypeBuilderInstantiation)) throw new ArgumentException(Environment.GetResourceString("Argument_NeedNonGenericType"), "type"); return MethodOnTypeBuilderInstantiation.GetMethod(method, type as TypeBuilderInstantiation); } public static ConstructorInfo GetConstructor(Type type, ConstructorInfo constructor) { if (!(type is TypeBuilder) && !(type is TypeBuilderInstantiation)) throw new ArgumentException(Environment.GetResourceString("Argument_MustBeTypeBuilder")); if (!constructor.DeclaringType.IsGenericTypeDefinition) throw new ArgumentException(Environment.GetResourceString("Argument_ConstructorNeedGenericDeclaringType"), "constructor"); Contract.EndContractBlock(); if (!(type is TypeBuilderInstantiation)) throw new ArgumentException(Environment.GetResourceString("Argument_NeedNonGenericType"), "type"); // TypeBuilder G ==> TypeBuilderInstantiation G if (type is TypeBuilder && type.IsGenericTypeDefinition) type = type.MakeGenericType(type.GetGenericArguments()); if (type.GetGenericTypeDefinition() != constructor.DeclaringType) throw new ArgumentException(Environment.GetResourceString("Argument_InvalidConstructorDeclaringType"), "type"); return ConstructorOnTypeBuilderInstantiation.GetConstructor(constructor, type as TypeBuilderInstantiation); } public static FieldInfo GetField(Type type, FieldInfo field) { if (!(type is TypeBuilder) && !(type is TypeBuilderInstantiation)) throw new ArgumentException(Environment.GetResourceString("Argument_MustBeTypeBuilder")); if (!field.DeclaringType.IsGenericTypeDefinition) throw new ArgumentException(Environment.GetResourceString("Argument_FieldNeedGenericDeclaringType"), "field"); Contract.EndContractBlock(); if (!(type is TypeBuilderInstantiation)) throw new ArgumentException(Environment.GetResourceString("Argument_NeedNonGenericType"), "type"); // TypeBuilder G ==> TypeBuilderInstantiation G if (type is TypeBuilder && type.IsGenericTypeDefinition) type = type.MakeGenericType(type.GetGenericArguments()); if (type.GetGenericTypeDefinition() != field.DeclaringType) throw new ArgumentException(Environment.GetResourceString("Argument_InvalidFieldDeclaringType"), "type"); return FieldOnTypeBuilderInstantiation.GetField(field, type as TypeBuilderInstantiation); } #endregion #region Public Const public const int UnspecifiedTypeSize = 0; #endregion #region Private Static FCalls [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] private static extern void SetParentType(RuntimeModule module, int tdTypeDef, int tkParent); [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] private static extern void AddInterfaceImpl(RuntimeModule module, int tdTypeDef, int tkInterface); #endregion #region Internal Static FCalls [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] internal static extern int DefineMethod(RuntimeModule module, int tkParent, String name, byte[] signature, int sigLength, MethodAttributes attributes); [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] internal static extern int DefineMethodSpec(RuntimeModule module, int tkParent, byte[] signature, int sigLength); [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] internal static extern int DefineField(RuntimeModule module, int tkParent, String name, byte[] signature, int sigLength, FieldAttributes attributes); [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] private static extern void SetMethodIL(RuntimeModule module, int tk, bool isInitLocals, byte[] body, int bodyLength, byte[] LocalSig, int sigLength, int maxStackSize, __ExceptionInstance[] exceptions, int numExceptions, int [] tokenFixups, int numTokenFixups, int [] rvaFixups, int numRvaFixups); [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] private static extern void DefineCustomAttribute(RuntimeModule module, int tkAssociate, int tkConstructor, byte[] attr, int attrLength, bool toDisk, bool updateCompilerFlags); [System.Security.SecurityCritical] // auto-generated internal static void DefineCustomAttribute(ModuleBuilder module, int tkAssociate, int tkConstructor, byte[] attr, bool toDisk, bool updateCompilerFlags) { byte[] localAttr = null; if (attr != null) { localAttr = new byte[attr.Length]; Array.Copy(attr, localAttr, attr.Length); } DefineCustomAttribute(module.GetNativeHandle(), tkAssociate, tkConstructor, localAttr, (localAttr != null) ? localAttr.Length : 0, toDisk, updateCompilerFlags); } [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] internal static extern void SetPInvokeData(RuntimeModule module, String DllName, String name, int token, int linkFlags); [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] internal static extern int DefineProperty(RuntimeModule module, int tkParent, String name, PropertyAttributes attributes, byte[] signature, int sigLength); [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] internal static extern int DefineEvent(RuntimeModule module, int tkParent, String name, EventAttributes attributes, int tkEventType); [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] internal static extern void DefineMethodSemantics(RuntimeModule module, int tkAssociation, MethodSemanticsAttributes semantics, int tkMethod); [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] internal static extern void DefineMethodImpl(RuntimeModule module, int tkType, int tkBody, int tkDecl); [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] internal static extern void SetMethodImpl(RuntimeModule module, int tkMethod, MethodImplAttributes MethodImplAttributes); [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] internal static extern int SetParamInfo(RuntimeModule module, int tkMethod, int iSequence, ParameterAttributes iParamAttributes, String strParamName); [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] internal static extern int GetTokenFromSig(RuntimeModule module, byte[] signature, int sigLength); [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] internal static extern void SetFieldLayoutOffset(RuntimeModule module, int fdToken, int iOffset); [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] internal static extern void SetClassLayout(RuntimeModule module, int tk, PackingSize iPackingSize, int iTypeSize); [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] internal static extern void SetFieldMarshal(RuntimeModule module, int tk, byte[] ubMarshal, int ubSize); [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] private static extern unsafe void SetConstantValue(RuntimeModule module, int tk, int corType, void* pValue); [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] internal static extern void AddDeclarativeSecurity(RuntimeModule module, int parent, SecurityAction action, byte[] blob, int cb); #endregion #region Internal\Private Static Members private static bool IsPublicComType(Type type) { // Internal Helper to determine if a type should be added to ComType table. // A top level type should be added if it is Public. // A nested type should be added if the top most enclosing type is Public // and all the enclosing types are NestedPublic Type enclosingType = type.DeclaringType; if (enclosingType != null) { if (IsPublicComType(enclosingType)) { if ((type.Attributes & TypeAttributes.VisibilityMask) == TypeAttributes.NestedPublic) { return true; } } } else { if ((type.Attributes & TypeAttributes.VisibilityMask) == TypeAttributes.Public) { return true; } } return false; } [Pure] internal static bool IsTypeEqual(Type t1, Type t2) { // Maybe we are lucky that they are equal in the first place if (t1 == t2) return true; TypeBuilder tb1 = null; TypeBuilder tb2 = null; Type runtimeType1 = null; Type runtimeType2 = null; // set up the runtimeType and TypeBuilder type corresponding to t1 and t2 if (t1 is TypeBuilder) { tb1 =(TypeBuilder)t1; // This will be null if it is not baked. runtimeType1 = tb1.m_runtimeType; } else { runtimeType1 = t1; } if (t2 is TypeBuilder) { tb2 =(TypeBuilder)t2; // This will be null if it is not baked. runtimeType2 = tb2.m_runtimeType; } else { runtimeType2 = t2; } // If the type builder view is eqaul then it is equal if (tb1 != null && tb2 != null && Object.ReferenceEquals(tb1, tb2)) return true; // if the runtimetype view is eqaul than it is equal if (runtimeType1 != null && runtimeType2 != null && runtimeType1 == runtimeType2) return true; return false; } [System.Security.SecurityCritical] // auto-generated internal static unsafe void SetConstantValue(ModuleBuilder module, int tk, Type destType, Object value) { // This is a helper function that is used by ParameterBuilder, PropertyBuilder, // and FieldBuilder to validate a default value and save it in the meta-data. if (value != null) { Type type = value.GetType(); // We should allow setting a constant value on a ByRef parameter if (destType.IsByRef) destType = destType.GetElementType(); if (destType.IsEnum) { // | UnderlyingSystemType | Enum.GetUnderlyingType() | IsEnum // ----------------------------------|---------------------------|---------------------------|--------- // runtime Enum Type | self | underlying type of enum | TRUE // EnumBuilder | underlying type of enum | underlying type of enum* | TRUE // TypeBuilder of enum types** | underlying type of enum | Exception | TRUE // TypeBuilder of enum types (baked) | runtime enum type | Exception | TRUE // *: the behavior of Enum.GetUnderlyingType(EnumBuilder) might change in the future // so let's not depend on it. // **: created with System.Enum as the parent type. // The above behaviors might not be the most consistent but we have to live with them. Type underlyingType; EnumBuilder enumBldr; TypeBuilder typeBldr; if ((enumBldr = destType as EnumBuilder) != null) { underlyingType = enumBldr.UnderlyingSystemType; // The constant value supplied should match either the baked enum type or its underlying type // we don't need to compare it with the EnumBuilder itself because you can never have an object of that type if (type != enumBldr.RuntimeEnumType && type != underlyingType) throw new ArgumentException(Environment.GetResourceString("Argument_ConstantDoesntMatch")); } else if ((typeBldr = destType as TypeBuilder) != null) { underlyingType = typeBldr.m_underlyingSystemType; // The constant value supplied should match either the baked enum type or its underlying type // typeBldr.m_underlyingSystemType is null if the user hasn't created a "value__" field on the enum if (underlyingType == null || (type != typeBldr.UnderlyingSystemType && type != underlyingType)) throw new ArgumentException(Environment.GetResourceString("Argument_ConstantDoesntMatch")); } else // must be a runtime Enum Type { Contract.Assert(destType is RuntimeType, "destType is not a runtime type, an EnumBuilder, or a TypeBuilder."); underlyingType = Enum.GetUnderlyingType(destType); // The constant value supplied should match either the enum itself or its underlying type if (type != destType && type != underlyingType) throw new ArgumentException(Environment.GetResourceString("Argument_ConstantDoesntMatch")); } type = underlyingType; } else { // Note that it is non CLS compliant if destType != type. But RefEmit never guarantees CLS-Compliance. if (!destType.IsAssignableFrom(type)) throw new ArgumentException(Environment.GetResourceString("Argument_ConstantDoesntMatch")); } CorElementType corType = RuntimeTypeHandle.GetCorElementType(type.GetTypeHandleInternal().GetRuntimeType()); switch (corType) { case CorElementType.I1: case CorElementType.U1: case CorElementType.Boolean: case CorElementType.I2: case CorElementType.U2: case CorElementType.Char: case CorElementType.I4: case CorElementType.U4: case CorElementType.R4: case CorElementType.I8: case CorElementType.U8: case CorElementType.R8: fixed (byte* pData = &JitHelpers.GetPinningHelper(value).m_data) SetConstantValue(module.GetNativeHandle(), tk, (int)corType, pData); break; default: if (type == typeof(String)) { fixed (char* pString = (string)value) SetConstantValue(module.GetNativeHandle(), tk, (int)CorElementType.String, pString); } else if (type == typeof(DateTime)) { //date is a I8 representation long ticks = ((DateTime)value).Ticks; SetConstantValue(module.GetNativeHandle(), tk, (int)CorElementType.I8, &ticks); } else { throw new ArgumentException(Environment.GetResourceString("Argument_ConstantNotSupported", type.ToString())); } break; } } else { if (destType.IsValueType) throw new ArgumentException(Environment.GetResourceString("Argument_ConstantNull")); SetConstantValue(module.GetNativeHandle(), tk, (int)CorElementType.Class, null); } } #endregion #region Private Data Members internal List m_ca; private TypeToken m_tdType; private ModuleBuilder m_module; internal String m_strName; private String m_strNameSpace; private String m_strFullQualName; private Type m_typeParent; private List m_typeInterfaces; internal TypeAttributes m_iAttr; internal GenericParameterAttributes m_genParamAttributes; internal List m_listMethods; internal int m_lastTokenizedMethod; private int m_constructorCount; private int m_iTypeSize; private PackingSize m_iPackingSize; private TypeBuilder m_DeclaringType; private Type m_underlyingSystemType; // set on the underlying TypeBuilder When a user defines a literal on an EnumBuilder internal bool m_isHiddenGlobalType; internal bool m_isHiddenType; internal bool m_hasBeenCreated; internal RuntimeType m_runtimeType; private int m_genParamPos; private GenericTypeParameterBuilder[] m_inst; private bool m_bIsGenParam; private bool m_bIsGenTypeDef; private MethodBuilder m_declMeth; private TypeBuilder m_genTypeDef; #endregion #region Constructor internal TypeBuilder(string szName, int genParamPos, MethodBuilder declMeth) { Contract.Requires(declMeth != null); m_declMeth = declMeth; m_DeclaringType =m_declMeth.GetTypeBuilder(); m_module =declMeth.GetModuleBuilder(); InitAsGenericParam(szName, genParamPos); } private TypeBuilder(string szName, int genParamPos, TypeBuilder declType) { Contract.Requires(declType != null); m_DeclaringType = declType; m_module =declType.GetModuleBuilder(); InitAsGenericParam(szName, genParamPos); } private void InitAsGenericParam(string szName, int genParamPos) { m_strName = szName; m_genParamPos = genParamPos; m_bIsGenParam = true; m_bIsGenTypeDef = false; m_typeInterfaces = new List (); } [System.Security.SecurityCritical] // auto-generated internal TypeBuilder(String name, TypeAttributes attr, Type parent, Module module, PackingSize iPackingSize, int iTypeSize, TypeBuilder enclosingType) { Init(name, attr, parent, null, module, iPackingSize, iTypeSize, enclosingType); } [System.Security.SecurityCritical] // auto-generated internal TypeBuilder(String name, TypeAttributes attr, Type parent, Type[] interfaces, Module module, PackingSize iPackingSize, TypeBuilder enclosingType) { Init(name, attr, parent, interfaces, module, iPackingSize, UnspecifiedTypeSize, enclosingType); } internal TypeBuilder(ModuleBuilder module) { m_tdType = new TypeToken((int)MetadataTokenType.TypeDef); m_isHiddenGlobalType = true; m_module =(ModuleBuilder)module; m_listMethods = new List (); // No token has been created so let's initialize it to -1 // The first time we call MethodBuilder.GetToken this will incremented. m_lastTokenizedMethod = -1; } [System.Security.SecurityCritical] // auto-generated private void Init(String fullname, TypeAttributes attr, Type parent, Type[] interfaces, Module module, PackingSize iPackingSize, int iTypeSize, TypeBuilder enclosingType) { if (fullname == null) throw new ArgumentNullException("fullname"); if (fullname.Length == 0) throw new ArgumentException(Environment.GetResourceString("Argument_EmptyName"), "fullname"); if (fullname[0] == '\0') throw new ArgumentException(Environment.GetResourceString("Argument_IllegalName"), "fullname"); if (fullname.Length > 1023) throw new ArgumentException(Environment.GetResourceString("Argument_TypeNameTooLong"), "fullname"); Contract.EndContractBlock(); int i; m_bIsGenTypeDef = false; m_bIsGenParam = false; m_hasBeenCreated = false; m_runtimeType = null; m_isHiddenGlobalType = false; m_isHiddenType = false; m_module =(ModuleBuilder) module; m_DeclaringType = enclosingType; AssemblyBuilder containingAssem = m_module.ContainingAssemblyBuilder; m_underlyingSystemType = null; // used when client use TypeBuilder to define Enum // cannot have two types within the same assembly of the same name containingAssem.m_assemblyData.CheckTypeNameConflict(fullname, enclosingType); if (enclosingType != null) { // Nested Type should have nested attribute set. // If we are renumbering TypeAttributes' bit, we need to change the logic here. if (((attr & TypeAttributes.VisibilityMask) == TypeAttributes.Public) ||((attr & TypeAttributes.VisibilityMask) == TypeAttributes.NotPublic)) throw new ArgumentException(Environment.GetResourceString("Argument_BadNestedTypeFlags"), "attr"); } int[] interfaceTokens = null; if (interfaces != null) { for(i = 0; i < interfaces.Length; i++) { if (interfaces[i] == null) { // cannot contain null in the interface list throw new ArgumentNullException("interfaces"); } } interfaceTokens = new int[interfaces.Length + 1]; for(i = 0; i < interfaces.Length; i++) { interfaceTokens[i] = m_module.GetTypeTokenInternal(interfaces[i]).Token; } } int iLast = fullname.LastIndexOf('.'); if (iLast == -1 || iLast == 0) { // no name space m_strNameSpace = String.Empty; m_strName = fullname; } else { // split the name space m_strNameSpace = fullname.Substring(0, iLast); m_strName = fullname.Substring(iLast + 1); } VerifyTypeAttributes(attr); m_iAttr = attr; SetParent(parent); m_listMethods = new List (); m_lastTokenizedMethod = -1; SetInterfaces(interfaces); m_constructorCount=0; int tkParent = 0; if (m_typeParent != null) tkParent = m_module.GetTypeTokenInternal(m_typeParent).Token; int tkEnclosingType = 0; if (enclosingType != null) { tkEnclosingType = enclosingType.m_tdType.Token; } m_tdType = new TypeToken(DefineType(m_module.GetNativeHandle(), fullname, tkParent, m_iAttr, tkEnclosingType, interfaceTokens)); m_iPackingSize = iPackingSize; m_iTypeSize = iTypeSize; if ((m_iPackingSize != 0) ||(m_iTypeSize != 0)) SetClassLayout(GetModuleBuilder().GetNativeHandle(), m_tdType.Token, m_iPackingSize, m_iTypeSize); #if !FEATURE_CORECLR // If the type is public and it is contained in a assemblyBuilder, // update the public COMType list. if (IsPublicComType(this)) { if (containingAssem.IsPersistable() && m_module.IsTransient() == false) { // This will throw InvalidOperationException if the assembly has been saved // Ideally we should reject all emit operations if the assembly has been saved, // but that would be a breaking change for some. Currently you cannot define // modules and public types, but you can still define private types and global methods. containingAssem.m_assemblyData.AddPublicComType(this); } // Now add the type to the ExportedType table if (!m_module.Equals(containingAssem.ManifestModule)) containingAssem.DefineExportedTypeInMemory(this, m_module.m_moduleData.FileToken, m_tdType.Token); } #endif } #endregion #region Private Members [System.Security.SecurityCritical] // auto-generated private MethodBuilder DefinePInvokeMethodHelper( String name, String dllName, String importName, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] returnTypeRequiredCustomModifiers, Type[] returnTypeOptionalCustomModifiers, Type[] parameterTypes, Type[][] parameterTypeRequiredCustomModifiers, Type[][] parameterTypeOptionalCustomModifiers, CallingConvention nativeCallConv, CharSet nativeCharSet) { CheckContext(returnType); CheckContext(returnTypeRequiredCustomModifiers, returnTypeOptionalCustomModifiers, parameterTypes); CheckContext(parameterTypeRequiredCustomModifiers); CheckContext(parameterTypeOptionalCustomModifiers); lock(SyncRoot) { return DefinePInvokeMethodHelperNoLock(name, dllName, importName, attributes, callingConvention, returnType, returnTypeRequiredCustomModifiers, returnTypeOptionalCustomModifiers, parameterTypes, parameterTypeRequiredCustomModifiers, parameterTypeOptionalCustomModifiers, nativeCallConv, nativeCharSet); } } [System.Security.SecurityCritical] // auto-generated private MethodBuilder DefinePInvokeMethodHelperNoLock( String name, String dllName, String importName, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] returnTypeRequiredCustomModifiers, Type[] returnTypeOptionalCustomModifiers, Type[] parameterTypes, Type[][] parameterTypeRequiredCustomModifiers, Type[][] parameterTypeOptionalCustomModifiers, CallingConvention nativeCallConv, CharSet nativeCharSet) { if (name == null) throw new ArgumentNullException("name"); if (name.Length == 0) throw new ArgumentException(Environment.GetResourceString("Argument_EmptyName"), "name"); if (dllName == null) throw new ArgumentNullException("dllName"); if (dllName.Length == 0) throw new ArgumentException(Environment.GetResourceString("Argument_EmptyName"), "dllName"); if (importName == null) throw new ArgumentNullException("importName"); if (importName.Length == 0) throw new ArgumentException(Environment.GetResourceString("Argument_EmptyName"), "importName"); if ((attributes & MethodAttributes.Abstract) != 0) throw new ArgumentException(Environment.GetResourceString("Argument_BadPInvokeMethod")); Contract.EndContractBlock(); if ((m_iAttr & TypeAttributes.ClassSemanticsMask) == TypeAttributes.Interface) throw new ArgumentException(Environment.GetResourceString("Argument_BadPInvokeOnInterface")); ThrowIfCreated(); attributes = attributes | MethodAttributes.PinvokeImpl; MethodBuilder method = new MethodBuilder(name, attributes, callingConvention, returnType, returnTypeRequiredCustomModifiers, returnTypeOptionalCustomModifiers, parameterTypes, parameterTypeRequiredCustomModifiers, parameterTypeOptionalCustomModifiers, m_module, this, false); //The signature grabbing code has to be up here or the signature won't be finished //and our equals check won't work. int sigLength; byte[] sigBytes = method.GetMethodSignature().InternalGetSignature(out sigLength); if (m_listMethods.Contains(method)) { throw new ArgumentException(Environment.GetResourceString("Argument_MethodRedefined")); } m_listMethods.Add(method); MethodToken token = method.GetToken(); int linkFlags = 0; switch(nativeCallConv) { case CallingConvention.Winapi: linkFlags =(int)PInvokeMap.CallConvWinapi; break; case CallingConvention.Cdecl: linkFlags =(int)PInvokeMap.CallConvCdecl; break; case CallingConvention.StdCall: linkFlags =(int)PInvokeMap.CallConvStdcall; break; case CallingConvention.ThisCall: linkFlags =(int)PInvokeMap.CallConvThiscall; break; case CallingConvention.FastCall: linkFlags =(int)PInvokeMap.CallConvFastcall; break; } switch(nativeCharSet) { case CharSet.None: linkFlags |=(int)PInvokeMap.CharSetNotSpec; break; case CharSet.Ansi: linkFlags |=(int)PInvokeMap.CharSetAnsi; break; case CharSet.Unicode: linkFlags |=(int)PInvokeMap.CharSetUnicode; break; case CharSet.Auto: linkFlags |=(int)PInvokeMap.CharSetAuto; break; } SetPInvokeData(m_module.GetNativeHandle(), dllName, importName, token.Token, linkFlags); method.SetToken(token); return method; } [System.Security.SecurityCritical] // auto-generated private FieldBuilder DefineDataHelper(String name, byte[] data, int size, FieldAttributes attributes) { String strValueClassName; TypeBuilder valueClassType; FieldBuilder fdBuilder; TypeAttributes typeAttributes; if (name == null) throw new ArgumentNullException("name"); if (name.Length == 0) throw new ArgumentException(Environment.GetResourceString("Argument_EmptyName"), "name"); if (size <= 0 || size >= 0x003f0000) throw new ArgumentException(Environment.GetResourceString("Argument_BadSizeForData")); Contract.EndContractBlock(); ThrowIfCreated(); // form the value class name strValueClassName = ModuleBuilderData.MULTI_BYTE_VALUE_CLASS + size; // Is this already defined in this module? Type temp = m_module.FindTypeBuilderWithName(strValueClassName, false); valueClassType = temp as TypeBuilder; if (valueClassType == null) { typeAttributes = TypeAttributes.Public | TypeAttributes.ExplicitLayout | TypeAttributes.Class | TypeAttributes.Sealed | TypeAttributes.AnsiClass; // Define the backing value class valueClassType = m_module.DefineType(strValueClassName, typeAttributes, typeof(System.ValueType), PackingSize.Size1, size); valueClassType.m_isHiddenType = true; valueClassType.CreateType(); } fdBuilder = DefineField(name, valueClassType,(attributes | FieldAttributes.Static)); // now we need to set the RVA fdBuilder.SetData(data, size); return fdBuilder; } private void VerifyTypeAttributes(TypeAttributes attr) { // Verify attr consistency for Nesting or otherwise. if (DeclaringType == null) { // Not a nested class. if (((attr & TypeAttributes.VisibilityMask) != TypeAttributes.NotPublic) &&((attr & TypeAttributes.VisibilityMask) != TypeAttributes.Public)) { throw new ArgumentException(Environment.GetResourceString("Argument_BadTypeAttrNestedVisibilityOnNonNestedType")); } } else { // Nested class. if (((attr & TypeAttributes.VisibilityMask) == TypeAttributes.NotPublic) ||((attr & TypeAttributes.VisibilityMask) == TypeAttributes.Public)) { throw new ArgumentException(Environment.GetResourceString("Argument_BadTypeAttrNonNestedVisibilityNestedType")); } } // Verify that the layout mask is valid. if (((attr & TypeAttributes.LayoutMask) != TypeAttributes.AutoLayout) &&((attr & TypeAttributes.LayoutMask) != TypeAttributes.SequentialLayout) &&((attr & TypeAttributes.LayoutMask) != TypeAttributes.ExplicitLayout)) { throw new ArgumentException(Environment.GetResourceString("Argument_BadTypeAttrInvalidLayout")); } // Check if the user attempted to set any reserved bits. if ((attr & TypeAttributes.ReservedMask) != 0) { throw new ArgumentException(Environment.GetResourceString("Argument_BadTypeAttrReservedBitsSet")); } } [Pure] public bool IsCreated() { return m_hasBeenCreated; } #endregion #region FCalls [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] private extern static int DefineType(RuntimeModule module, String fullname, int tkParent, TypeAttributes attributes, int tkEnclosingType, int[] interfaceTokens); [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] private extern static int DefineGenericParam(RuntimeModule module, String name, int tkParent, GenericParameterAttributes attributes, int position, int[] constraints); [System.Security.SecurityCritical] // auto-generated [ResourceExposure(ResourceScope.None)] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] [SuppressUnmanagedCodeSecurity] private static extern void TermCreateClass(RuntimeModule module, int tk, ObjectHandleOnStack type); #endregion #region Internal Methods internal void ThrowIfCreated() { if (IsCreated()) throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_TypeHasBeenCreated")); } internal object SyncRoot { get { return m_module.SyncRoot; } } internal ModuleBuilder GetModuleBuilder() { return m_module; } #endregion #region Object Overrides public override String ToString() { return TypeNameBuilder.ToString(this, TypeNameBuilder.Format.ToString); } #endregion #region MemberInfo Overrides public override Type DeclaringType { get { return m_DeclaringType; } } public override Type ReflectedType { // Return the class that was used to obtain this field. get { return m_DeclaringType; } } public override String Name { get { return m_strName; } } public override Module Module { get { return GetModuleBuilder(); } } internal int MetadataTokenInternal { get { return m_tdType.Token; } } #endregion #region Type Overrides public override Guid GUID { get { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.GUID; } } public override Object InvokeMember(String name, BindingFlags invokeAttr, Binder binder, Object target, Object[] args, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParameters) { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.InvokeMember(name, invokeAttr, binder, target, args, modifiers, culture, namedParameters); } public override Assembly Assembly { get { return m_module.Assembly; } } public override RuntimeTypeHandle TypeHandle { get { throw new NotSupportedException(Environment.GetResourceString("NotSupported_DynamicModule")); } } public override String FullName { get { if (m_strFullQualName == null) m_strFullQualName = TypeNameBuilder.ToString(this, TypeNameBuilder.Format.FullName); return m_strFullQualName; } } public override String Namespace { get { return m_strNameSpace; } } public override String AssemblyQualifiedName { get { return TypeNameBuilder.ToString(this, TypeNameBuilder.Format.AssemblyQualifiedName); } } public override Type BaseType { get{ return m_typeParent; } } protected override ConstructorInfo GetConstructorImpl(BindingFlags bindingAttr,Binder binder, CallingConventions callConvention, Type[] types,ParameterModifier[] modifiers) { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.GetConstructor(bindingAttr, binder, callConvention, types, modifiers); } [System.Runtime.InteropServices.ComVisible(true)] public override ConstructorInfo[] GetConstructors(BindingFlags bindingAttr) { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.GetConstructors(bindingAttr); } protected override MethodInfo GetMethodImpl(String name,BindingFlags bindingAttr,Binder binder, CallingConventions callConvention, Type[] types,ParameterModifier[] modifiers) { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); if (types == null) { return m_runtimeType.GetMethod(name, bindingAttr); } else { return m_runtimeType.GetMethod(name, bindingAttr, binder, callConvention, types, modifiers); } } public override MethodInfo[] GetMethods(BindingFlags bindingAttr) { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.GetMethods(bindingAttr); } public override FieldInfo GetField(String name, BindingFlags bindingAttr) { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.GetField(name, bindingAttr); } public override FieldInfo[] GetFields(BindingFlags bindingAttr) { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.GetFields(bindingAttr); } public override Type GetInterface(String name,bool ignoreCase) { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.GetInterface(name, ignoreCase); } public override Type[] GetInterfaces() { if (m_runtimeType != null) { return m_runtimeType.GetInterfaces(); } if (m_typeInterfaces == null) { return new Type[0]; } return m_typeInterfaces.ToArray(); } public override EventInfo GetEvent(String name,BindingFlags bindingAttr) { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.GetEvent(name, bindingAttr); } public override EventInfo[] GetEvents() { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.GetEvents(); } protected override PropertyInfo GetPropertyImpl(String name, BindingFlags bindingAttr, Binder binder, Type returnType, Type[] types, ParameterModifier[] modifiers) { throw new NotSupportedException(Environment.GetResourceString("NotSupported_DynamicModule")); } public override PropertyInfo[] GetProperties(BindingFlags bindingAttr) { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.GetProperties(bindingAttr); } public override Type[] GetNestedTypes(BindingFlags bindingAttr) { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.GetNestedTypes(bindingAttr); } public override Type GetNestedType(String name, BindingFlags bindingAttr) { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.GetNestedType(name,bindingAttr); } public override MemberInfo[] GetMember(String name, MemberTypes type, BindingFlags bindingAttr) { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.GetMember(name, type, bindingAttr); } [System.Runtime.InteropServices.ComVisible(true)] public override InterfaceMapping GetInterfaceMap(Type interfaceType) { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.GetInterfaceMap(interfaceType); } public override EventInfo[] GetEvents(BindingFlags bindingAttr) { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.GetEvents(bindingAttr); } public override MemberInfo[] GetMembers(BindingFlags bindingAttr) { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.GetMembers(bindingAttr); } public override bool IsAssignableFrom(Type c) { if (TypeBuilder.IsTypeEqual(c, this)) return true; Type fromRuntimeType = null; TypeBuilder fromTypeBuilder = c as TypeBuilder; if (fromTypeBuilder != null) fromRuntimeType = fromTypeBuilder.m_runtimeType; else fromRuntimeType = c; if (fromRuntimeType != null && fromRuntimeType.IsRuntimeType) { // fromType is baked. So if this type is not baked, it cannot be assignable to! if (m_runtimeType == null) return false; // since toType is also baked, delegate to the base return m_runtimeType.IsAssignableFrom(fromRuntimeType); } // So if c is not a runtimeType nor TypeBuilder. We don't know how to deal with it. // return false then. if (fromTypeBuilder == null) return false; // If fromTypeBuilder is a subclass of this class, then c can be cast to this type. if (fromTypeBuilder.IsSubclassOf(this)) return true; if (this.IsInterface == false) return false; // now is This type a base type on one of the interface impl? Type[] interfaces = fromTypeBuilder.GetInterfaces(); for(int i = 0; i < interfaces.Length; i++) { // unfortunately, IsSubclassOf does not cover the case when they are the same type. if (TypeBuilder.IsTypeEqual(interfaces[i], this)) return true; if (interfaces[i].IsSubclassOf(this)) return true; } return false; } protected override TypeAttributes GetAttributeFlagsImpl() { return m_iAttr; } protected override bool IsArrayImpl() { return false; } protected override bool IsByRefImpl() { return false; } protected override bool IsPointerImpl() { return false; } protected override bool IsPrimitiveImpl() { return false; } protected override bool IsCOMObjectImpl() { return((GetAttributeFlagsImpl() & TypeAttributes.Import) != 0) ? true : false; } public override Type GetElementType() { // You will never have to deal with a TypeBuilder if you are just referring to arrays. throw new NotSupportedException(Environment.GetResourceString("NotSupported_DynamicModule")); } protected override bool HasElementTypeImpl() { return false; } public override bool IsSecurityCritical { get { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.IsSecurityCritical; } } public override bool IsSecuritySafeCritical { get { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.IsSecuritySafeCritical; } } public override bool IsSecurityTransparent { get { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return m_runtimeType.IsSecurityTransparent; } } [System.Runtime.InteropServices.ComVisible(true)] [Pure] public override bool IsSubclassOf(Type c) { Type p = this; if (TypeBuilder.IsTypeEqual(p, c)) return false; p = p.BaseType; while(p != null) { if (TypeBuilder.IsTypeEqual(p, c)) return true; p = p.BaseType; } return false; } public override Type UnderlyingSystemType { get { if (m_runtimeType != null) return m_runtimeType.UnderlyingSystemType; if (!IsEnum) return this; if (m_underlyingSystemType == null) throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_NoUnderlyingTypeOnEnum")); return m_underlyingSystemType; } } public override Type MakePointerType() { return SymbolType.FormCompoundType("*".ToCharArray(), this, 0); } public override Type MakeByRefType() { return SymbolType.FormCompoundType("&".ToCharArray(), this, 0); } public override Type MakeArrayType() { return SymbolType.FormCompoundType("[]".ToCharArray(), this, 0); } public override Type MakeArrayType(int rank) { if (rank <= 0) throw new IndexOutOfRangeException(); Contract.EndContractBlock(); string szrank = ""; if (rank == 1) { szrank = "*"; } else { for(int i = 1; i < rank; i++) szrank += ","; } string s = String.Format(CultureInfo.InvariantCulture, "[{0}]", szrank); // [,,] return SymbolType.FormCompoundType((s).ToCharArray(), this, 0); } #endregion #region ICustomAttributeProvider Implementation [System.Security.SecuritySafeCritical] // auto-generated public override Object[] GetCustomAttributes(bool inherit) { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); Contract.EndContractBlock(); return CustomAttribute.GetCustomAttributes(m_runtimeType, typeof(object) as RuntimeType, inherit); } [System.Security.SecuritySafeCritical] // auto-generated public override Object[] GetCustomAttributes(Type attributeType, bool inherit) { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); if (attributeType == null) throw new ArgumentNullException("attributeType"); Contract.EndContractBlock(); RuntimeType attributeRuntimeType = attributeType.UnderlyingSystemType as RuntimeType; if (attributeRuntimeType == null) throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"),"attributeType"); return CustomAttribute.GetCustomAttributes(m_runtimeType, attributeRuntimeType, inherit); } [System.Security.SecuritySafeCritical] // auto-generated public override bool IsDefined(Type attributeType, bool inherit) { if (!IsCreated()) throw new NotSupportedException(Environment.GetResourceString("NotSupported_TypeNotYetCreated")); if (attributeType == null) throw new ArgumentNullException("attributeType"); Contract.EndContractBlock(); RuntimeType attributeRuntimeType = attributeType.UnderlyingSystemType as RuntimeType; if (attributeRuntimeType == null) throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"),"caType"); return CustomAttribute.IsDefined(m_runtimeType, attributeRuntimeType, inherit); } #endregion #region Public Member #region DefineType internal void ThrowIfGeneric() { if (IsGenericType && !IsGenericTypeDefinition) throw new InvalidOperationException(); } public override GenericParameterAttributes GenericParameterAttributes { get { return m_genParamAttributes; } } internal void SetInterfaces(params Type[] interfaces) { ThrowIfCreated(); m_typeInterfaces = new List (); if (interfaces != null) { m_typeInterfaces.AddRange(interfaces); } } public GenericTypeParameterBuilder[] DefineGenericParameters(params string[] names) { if (names == null) throw new ArgumentNullException("names"); if (names.Length == 0) throw new ArgumentException(); Contract.EndContractBlock(); for (int i = 0; i < names.Length; i ++) if (names[i] == null) throw new ArgumentNullException("names"); if (m_inst != null) throw new InvalidOperationException(); m_bIsGenTypeDef = true; m_inst = new GenericTypeParameterBuilder[names.Length]; for(int i = 0; i < names.Length; i ++) m_inst[i] = new GenericTypeParameterBuilder(new TypeBuilder(names[i], i, this)); return m_inst; } [System.Security.SecuritySafeCritical] // auto-generated public override Type MakeGenericType(params Type[] typeArguments) { CheckContext(typeArguments); return TypeBuilderInstantiation.MakeGenericType(this, typeArguments); } public override Type[] GetGenericArguments() { return m_inst; } public override bool IsGenericTypeDefinition { get { return m_bIsGenTypeDef; } } public override bool IsGenericType { get { return m_inst != null; } } public override bool IsGenericParameter { get { return m_bIsGenParam; } } public override int GenericParameterPosition { get { return m_genParamPos; } } public override MethodBase DeclaringMethod { get { return m_declMeth; } } public override Type GetGenericTypeDefinition() { if (IsGenericTypeDefinition) return this; if (m_genTypeDef == null) throw new InvalidOperationException(); return m_genTypeDef; } #endregion #region Define Method [System.Security.SecuritySafeCritical] // auto-generated public void DefineMethodOverride(MethodInfo methodInfoBody, MethodInfo methodInfoDeclaration) { lock(SyncRoot) { DefineMethodOverrideNoLock(methodInfoBody, methodInfoDeclaration); } } [System.Security.SecurityCritical] // auto-generated private void DefineMethodOverrideNoLock(MethodInfo methodInfoBody, MethodInfo methodInfoDeclaration) { if (methodInfoBody == null) throw new ArgumentNullException("methodInfoBody"); if (methodInfoDeclaration == null) throw new ArgumentNullException("methodInfoDeclaration"); Contract.EndContractBlock(); ThrowIfGeneric(); ThrowIfCreated(); if (!object.ReferenceEquals(methodInfoBody.DeclaringType, this)) // Loader restriction: body method has to be from this class throw new ArgumentException(Environment.GetResourceString("ArgumentException_BadMethodImplBody")); MethodToken tkBody; MethodToken tkDecl; tkBody = m_module.GetMethodTokenInternal(methodInfoBody); tkDecl = m_module.GetMethodTokenInternal(methodInfoDeclaration); DefineMethodImpl(m_module.GetNativeHandle(), m_tdType.Token, tkBody.Token, tkDecl.Token); } public MethodBuilder DefineMethod(String name, MethodAttributes attributes, Type returnType, Type[] parameterTypes) { return DefineMethod(name, attributes, CallingConventions.Standard, returnType, parameterTypes); } public MethodBuilder DefineMethod(String name, MethodAttributes attributes) { return DefineMethod(name, attributes, CallingConventions.Standard, null, null); } public MethodBuilder DefineMethod(String name, MethodAttributes attributes, CallingConventions callingConvention) { return DefineMethod(name, attributes, callingConvention, null, null); } public MethodBuilder DefineMethod(String name, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] parameterTypes) { return DefineMethod(name, attributes, callingConvention, returnType, null, null, parameterTypes, null, null); } [System.Security.SecuritySafeCritical] // auto-generated public MethodBuilder DefineMethod(String name, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] returnTypeRequiredCustomModifiers, Type[] returnTypeOptionalCustomModifiers, Type[] parameterTypes, Type[][] parameterTypeRequiredCustomModifiers, Type[][] parameterTypeOptionalCustomModifiers) { lock(SyncRoot) { return DefineMethodNoLock(name, attributes, callingConvention, returnType, returnTypeRequiredCustomModifiers, returnTypeOptionalCustomModifiers, parameterTypes, parameterTypeRequiredCustomModifiers, parameterTypeOptionalCustomModifiers); } } private MethodBuilder DefineMethodNoLock(String name, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] returnTypeRequiredCustomModifiers, Type[] returnTypeOptionalCustomModifiers, Type[] parameterTypes, Type[][] parameterTypeRequiredCustomModifiers, Type[][] parameterTypeOptionalCustomModifiers) { if (name == null) throw new ArgumentNullException("name"); if (name.Length == 0) throw new ArgumentException(Environment.GetResourceString("Argument_EmptyName"), "name"); Contract.EndContractBlock(); CheckContext(returnType); CheckContext(returnTypeRequiredCustomModifiers, returnTypeOptionalCustomModifiers, parameterTypes); CheckContext(parameterTypeRequiredCustomModifiers); CheckContext(parameterTypeOptionalCustomModifiers); if (parameterTypes != null) { if (parameterTypeOptionalCustomModifiers != null && parameterTypeOptionalCustomModifiers.Length != parameterTypes.Length) throw new ArgumentException(Environment.GetResourceString("Argument_MismatchedArrays", "parameterTypeOptionalCustomModifiers", "parameterTypes")); if (parameterTypeRequiredCustomModifiers != null && parameterTypeRequiredCustomModifiers.Length != parameterTypes.Length) throw new ArgumentException(Environment.GetResourceString("Argument_MismatchedArrays", "parameterTypeRequiredCustomModifiers", "parameterTypes")); } ThrowIfGeneric(); ThrowIfCreated(); if (!m_isHiddenGlobalType) { if (((m_iAttr & TypeAttributes.ClassSemanticsMask) == TypeAttributes.Interface) && (attributes & MethodAttributes.Abstract) == 0 &&(attributes & MethodAttributes.Static) == 0) throw new ArgumentException(Environment.GetResourceString("Argument_BadAttributeOnInterfaceMethod")); } // pass in Method attributes MethodBuilder method = new MethodBuilder( name, attributes, callingConvention, returnType, returnTypeRequiredCustomModifiers, returnTypeOptionalCustomModifiers, parameterTypes, parameterTypeRequiredCustomModifiers, parameterTypeOptionalCustomModifiers, m_module, this, false); if (!m_isHiddenGlobalType) { //If this method is declared to be a constructor, increment our constructor count. if ((method.Attributes & MethodAttributes.SpecialName) != 0 && method.Name.Equals(ConstructorInfo.ConstructorName)) { m_constructorCount++; } } m_listMethods.Add(method); return method; } #endregion #region Define Constructor [System.Security.SecuritySafeCritical] // auto-generated [System.Runtime.InteropServices.ComVisible(true)] public ConstructorBuilder DefineTypeInitializer() { lock(SyncRoot) { return DefineTypeInitializerNoLock(); } } [System.Security.SecurityCritical] // auto-generated private ConstructorBuilder DefineTypeInitializerNoLock() { ThrowIfGeneric(); ThrowIfCreated(); // change the attributes and the class constructor's name MethodAttributes attr = MethodAttributes.Private | MethodAttributes.Static | MethodAttributes.SpecialName; ConstructorBuilder constBuilder = new ConstructorBuilder( ConstructorInfo.TypeConstructorName, attr, CallingConventions.Standard, null, m_module, this); return constBuilder; } [System.Security.SecuritySafeCritical] // auto-generated [System.Runtime.InteropServices.ComVisible(true)] public ConstructorBuilder DefineDefaultConstructor(MethodAttributes attributes) { if ((m_iAttr & TypeAttributes.Interface) == TypeAttributes.Interface) { throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_ConstructorNotAllowedOnInterface")); } lock(SyncRoot) { return DefineDefaultConstructorNoLock(attributes); } } private ConstructorBuilder DefineDefaultConstructorNoLock(MethodAttributes attributes) { ThrowIfGeneric(); ConstructorBuilder constBuilder; // get the parent class's default constructor // We really don't want(BindingFlags.Instance|BindingFlags.Public|BindingFlags.NonPublic) here. We really want // constructors visible from the subclass, but that is not currently // available in BindingFlags. This more open binding is open to // runtime binding failures(like if we resolve to a private // constructor). ConstructorInfo con = null; if (m_typeParent is TypeBuilderInstantiation) { Type genericTypeDefinition = m_typeParent.GetGenericTypeDefinition(); if (genericTypeDefinition is TypeBuilder) genericTypeDefinition = ((TypeBuilder)genericTypeDefinition).m_runtimeType; if (genericTypeDefinition == null) throw new NotSupportedException(Environment.GetResourceString("NotSupported_DynamicModule")); Type inst = genericTypeDefinition.MakeGenericType(m_typeParent.GetGenericArguments()); if (inst is TypeBuilderInstantiation) con = TypeBuilder.GetConstructor(inst, genericTypeDefinition.GetConstructor( BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, Type.EmptyTypes, null)); else con = inst.GetConstructor( BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, Type.EmptyTypes, null); } if (con == null) { con = m_typeParent.GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, Type.EmptyTypes, null); } if (con == null) throw new NotSupportedException(Environment.GetResourceString("NotSupported_NoParentDefaultConstructor")); // Define the constructor Builder constBuilder = DefineConstructor(attributes, CallingConventions.Standard, null); m_constructorCount++; // generate the code to call the parent's default constructor ILGenerator il = constBuilder.GetILGenerator(); il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Call,con); il.Emit(OpCodes.Ret); constBuilder.m_ReturnILGen = false; return constBuilder; } [System.Runtime.InteropServices.ComVisible(true)] public ConstructorBuilder DefineConstructor(MethodAttributes attributes, CallingConventions callingConvention, Type[] parameterTypes) { return DefineConstructor(attributes, callingConvention, parameterTypes, null, null); } [System.Security.SecuritySafeCritical] // auto-generated [System.Runtime.InteropServices.ComVisible(true)] public ConstructorBuilder DefineConstructor(MethodAttributes attributes, CallingConventions callingConvention, Type[] parameterTypes, Type[][] requiredCustomModifiers, Type[][] optionalCustomModifiers) { if ((m_iAttr & TypeAttributes.Interface) == TypeAttributes.Interface && (attributes & MethodAttributes.Static) != MethodAttributes.Static) { throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_ConstructorNotAllowedOnInterface")); } lock(SyncRoot) { return DefineConstructorNoLock(attributes, callingConvention, parameterTypes, requiredCustomModifiers, optionalCustomModifiers); } } [System.Security.SecurityCritical] // auto-generated private ConstructorBuilder DefineConstructorNoLock(MethodAttributes attributes, CallingConventions callingConvention, Type[] parameterTypes, Type[][] requiredCustomModifiers, Type[][] optionalCustomModifiers) { CheckContext(parameterTypes); CheckContext(requiredCustomModifiers); CheckContext(optionalCustomModifiers); ThrowIfGeneric(); ThrowIfCreated(); String name; if ((attributes & MethodAttributes.Static) == 0) { name = ConstructorInfo.ConstructorName; } else { name = ConstructorInfo.TypeConstructorName; } attributes = attributes | MethodAttributes.SpecialName; ConstructorBuilder constBuilder = new ConstructorBuilder(name, attributes, callingConvention, parameterTypes, requiredCustomModifiers, optionalCustomModifiers, m_module, this); m_constructorCount++; return constBuilder; } #endregion #region Define PInvoke [System.Security.SecuritySafeCritical] // auto-generated public MethodBuilder DefinePInvokeMethod(String name, String dllName, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] parameterTypes, CallingConvention nativeCallConv, CharSet nativeCharSet) { ThrowIfGeneric(); MethodBuilder method = DefinePInvokeMethodHelper( name, dllName, name, attributes, callingConvention, returnType, null, null, parameterTypes, null, null, nativeCallConv, nativeCharSet); return method; } [System.Security.SecuritySafeCritical] // auto-generated public MethodBuilder DefinePInvokeMethod(String name, String dllName, String entryName, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] parameterTypes, CallingConvention nativeCallConv, CharSet nativeCharSet) { MethodBuilder method = DefinePInvokeMethodHelper( name, dllName, entryName, attributes, callingConvention, returnType, null, null, parameterTypes, null, null, nativeCallConv, nativeCharSet); return method; } [System.Security.SecuritySafeCritical] // auto-generated public MethodBuilder DefinePInvokeMethod(String name, String dllName, String entryName, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] returnTypeRequiredCustomModifiers, Type[] returnTypeOptionalCustomModifiers, Type[] parameterTypes, Type[][] parameterTypeRequiredCustomModifiers, Type[][] parameterTypeOptionalCustomModifiers, CallingConvention nativeCallConv, CharSet nativeCharSet) { ThrowIfGeneric(); MethodBuilder method = DefinePInvokeMethodHelper( name, dllName, entryName, attributes, callingConvention, returnType, returnTypeRequiredCustomModifiers, returnTypeOptionalCustomModifiers, parameterTypes, parameterTypeRequiredCustomModifiers, parameterTypeOptionalCustomModifiers, nativeCallConv, nativeCharSet); return method; } #endregion #region Define Nested Type [System.Security.SecuritySafeCritical] // auto-generated public TypeBuilder DefineNestedType(String name) { lock(SyncRoot) { return DefineNestedTypeNoLock(name); } } [System.Security.SecurityCritical] // auto-generated private TypeBuilder DefineNestedTypeNoLock(String name) { ThrowIfGeneric(); TypeBuilder typeBuilder; typeBuilder = new TypeBuilder(name, TypeAttributes.NestedPrivate, null, null, m_module, PackingSize.Unspecified, this); m_module.AddType(typeBuilder); return typeBuilder; } [System.Security.SecuritySafeCritical] // auto-generated [System.Runtime.InteropServices.ComVisible(true)] public TypeBuilder DefineNestedType(String name, TypeAttributes attr, Type parent, Type[] interfaces) { lock(SyncRoot) { return DefineNestedTypeNoLock(name, attr, parent, interfaces); } } [System.Security.SecurityCritical] // auto-generated private TypeBuilder DefineNestedTypeNoLock(String name, TypeAttributes attr, Type parent, Type[] interfaces) { CheckContext(parent); CheckContext(interfaces); ThrowIfGeneric(); TypeBuilder typeBuilder; typeBuilder = new TypeBuilder(name, attr, parent, interfaces, m_module, PackingSize.Unspecified, this); m_module.AddType(typeBuilder); return typeBuilder; } [System.Security.SecuritySafeCritical] // auto-generated public TypeBuilder DefineNestedType(String name, TypeAttributes attr, Type parent) { lock(SyncRoot) { return DefineNestedTypeNoLock(name, attr, parent); } } [System.Security.SecurityCritical] // auto-generated private TypeBuilder DefineNestedTypeNoLock(String name, TypeAttributes attr, Type parent) { ThrowIfGeneric(); TypeBuilder typeBuilder; typeBuilder = new TypeBuilder(name, attr, parent, null, m_module, PackingSize.Unspecified, this); m_module.AddType(typeBuilder); return typeBuilder; } [System.Security.SecuritySafeCritical] // auto-generated public TypeBuilder DefineNestedType(String name, TypeAttributes attr) { lock(SyncRoot) { return DefineNestedTypeNoLock(name, attr); } } [System.Security.SecurityCritical] // auto-generated private TypeBuilder DefineNestedTypeNoLock(String name, TypeAttributes attr) { ThrowIfGeneric(); TypeBuilder typeBuilder; typeBuilder = new TypeBuilder(name, attr, null, null, m_module, PackingSize.Unspecified, this); m_module.AddType(typeBuilder); return typeBuilder; } [System.Security.SecuritySafeCritical] // auto-generated public TypeBuilder DefineNestedType(String name, TypeAttributes attr, Type parent, int typeSize) { lock(SyncRoot) { return DefineNestedTypeNoLock(name, attr, parent, typeSize); } } [System.Security.SecurityCritical] // auto-generated private TypeBuilder DefineNestedTypeNoLock(String name, TypeAttributes attr, Type parent, int typeSize) { TypeBuilder typeBuilder; typeBuilder = new TypeBuilder(name, attr, parent, m_module, PackingSize.Unspecified, typeSize, this); m_module.AddType(typeBuilder); return typeBuilder; } [System.Security.SecuritySafeCritical] // auto-generated public TypeBuilder DefineNestedType(String name, TypeAttributes attr, Type parent, PackingSize packSize) { lock(SyncRoot) { return DefineNestedTypeNoLock(name, attr, parent, packSize); } } [System.Security.SecurityCritical] // auto-generated private TypeBuilder DefineNestedTypeNoLock(String name, TypeAttributes attr, Type parent, PackingSize packSize) { ThrowIfGeneric(); TypeBuilder typeBuilder; typeBuilder = new TypeBuilder(name, attr, parent, null, m_module, packSize, this); m_module.AddType(typeBuilder); return typeBuilder; } #endregion #region Define Field public FieldBuilder DefineField(String fieldName, Type type, FieldAttributes attributes) { return DefineField(fieldName, type, null, null, attributes); } [System.Security.SecuritySafeCritical] // auto-generated public FieldBuilder DefineField(String fieldName, Type type, Type[] requiredCustomModifiers, Type[] optionalCustomModifiers, FieldAttributes attributes) { lock(SyncRoot) { return DefineFieldNoLock(fieldName, type, requiredCustomModifiers, optionalCustomModifiers, attributes); } } [System.Security.SecurityCritical] // auto-generated private FieldBuilder DefineFieldNoLock(String fieldName, Type type, Type[] requiredCustomModifiers, Type[] optionalCustomModifiers, FieldAttributes attributes) { ThrowIfGeneric(); ThrowIfCreated(); CheckContext(type); CheckContext(requiredCustomModifiers); if (m_underlyingSystemType == null && IsEnum == true) { if ((attributes & FieldAttributes.Static) == 0) { // remember the underlying type for enum type m_underlyingSystemType = type; } } return new FieldBuilder(this, fieldName, type, requiredCustomModifiers, optionalCustomModifiers, attributes); } [System.Security.SecuritySafeCritical] // auto-generated public FieldBuilder DefineInitializedData(String name, byte[] data, FieldAttributes attributes) { lock(SyncRoot) { return DefineInitializedDataNoLock(name, data, attributes); } } [System.Security.SecurityCritical] // auto-generated private FieldBuilder DefineInitializedDataNoLock(String name, byte[] data, FieldAttributes attributes) { if (data == null) throw new ArgumentNullException("data"); Contract.EndContractBlock(); // This method will define an initialized Data in .sdata. // We will create a fake TypeDef to represent the data with size. This TypeDef // will be the signature for the Field. ThrowIfGeneric(); return DefineDataHelper(name, data, data.Length, attributes); } [System.Security.SecuritySafeCritical] // auto-generated public FieldBuilder DefineUninitializedData(String name, int size, FieldAttributes attributes) { lock(SyncRoot) { return DefineUninitializedDataNoLock(name, size, attributes); } } [System.Security.SecurityCritical] // auto-generated private FieldBuilder DefineUninitializedDataNoLock(String name, int size, FieldAttributes attributes) { // This method will define an uninitialized Data in .sdata. // We will create a fake TypeDef to represent the data with size. This TypeDef // will be the signature for the Field. ThrowIfGeneric(); return DefineDataHelper(name, null, size, attributes); } #endregion #region Define Properties and Events public PropertyBuilder DefineProperty(String name, PropertyAttributes attributes, Type returnType, Type[] parameterTypes) { return DefineProperty(name, attributes, returnType, null, null, parameterTypes, null, null); } [System.Security.SecuritySafeCritical] // auto-generated public PropertyBuilder DefineProperty(String name, PropertyAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] parameterTypes) { return DefineProperty(name, attributes, callingConvention, returnType, null, null, parameterTypes, null, null); } [System.Security.SecuritySafeCritical] // auto-generated public PropertyBuilder DefineProperty(String name, PropertyAttributes attributes, Type returnType, Type[] returnTypeRequiredCustomModifiers, Type[] returnTypeOptionalCustomModifiers, Type[] parameterTypes, Type[][] parameterTypeRequiredCustomModifiers, Type[][] parameterTypeOptionalCustomModifiers) { return DefineProperty(name, attributes, (CallingConventions)0, returnType, returnTypeRequiredCustomModifiers, returnTypeOptionalCustomModifiers, parameterTypes, parameterTypeRequiredCustomModifiers, parameterTypeOptionalCustomModifiers); } [System.Security.SecuritySafeCritical] // auto-generated public PropertyBuilder DefineProperty(String name, PropertyAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] returnTypeRequiredCustomModifiers, Type[] returnTypeOptionalCustomModifiers, Type[] parameterTypes, Type[][] parameterTypeRequiredCustomModifiers, Type[][] parameterTypeOptionalCustomModifiers) { lock(SyncRoot) { return DefinePropertyNoLock(name, attributes, callingConvention, returnType, returnTypeRequiredCustomModifiers, returnTypeOptionalCustomModifiers, parameterTypes, parameterTypeRequiredCustomModifiers, parameterTypeOptionalCustomModifiers); } } [System.Security.SecurityCritical] // auto-generated private PropertyBuilder DefinePropertyNoLock(String name, PropertyAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] returnTypeRequiredCustomModifiers, Type[] returnTypeOptionalCustomModifiers, Type[] parameterTypes, Type[][] parameterTypeRequiredCustomModifiers, Type[][] parameterTypeOptionalCustomModifiers) { if (name == null) throw new ArgumentNullException("name"); if (name.Length == 0) throw new ArgumentException(Environment.GetResourceString("Argument_EmptyName"), "name"); Contract.EndContractBlock(); ThrowIfGeneric(); CheckContext(returnType); CheckContext(returnTypeRequiredCustomModifiers, returnTypeOptionalCustomModifiers, parameterTypes); CheckContext(parameterTypeRequiredCustomModifiers); CheckContext(parameterTypeOptionalCustomModifiers); SignatureHelper sigHelper; int sigLength; byte[] sigBytes; ThrowIfCreated(); // get the signature in SignatureHelper form sigHelper = SignatureHelper.GetPropertySigHelper( m_module, callingConvention, returnType, returnTypeRequiredCustomModifiers, returnTypeOptionalCustomModifiers, parameterTypes, parameterTypeRequiredCustomModifiers, parameterTypeOptionalCustomModifiers); // get the signature in byte form sigBytes = sigHelper.InternalGetSignature(out sigLength); PropertyToken prToken = new PropertyToken(DefineProperty( m_module.GetNativeHandle(), m_tdType.Token, name, attributes, sigBytes, sigLength)); // create the property builder now. return new PropertyBuilder( m_module, name, sigHelper, attributes, returnType, prToken, this); } [System.Security.SecuritySafeCritical] // auto-generated public EventBuilder DefineEvent(String name, EventAttributes attributes, Type eventtype) { lock(SyncRoot) { return DefineEventNoLock(name, attributes, eventtype); } } [System.Security.SecurityCritical] // auto-generated private EventBuilder DefineEventNoLock(String name, EventAttributes attributes, Type eventtype) { if (name == null) throw new ArgumentNullException("name"); if (name.Length == 0) throw new ArgumentException(Environment.GetResourceString("Argument_EmptyName"), "name"); if (name[0] == '\0') throw new ArgumentException(Environment.GetResourceString("Argument_IllegalName"), "name"); Contract.EndContractBlock(); int tkType; EventToken evToken; CheckContext(eventtype); ThrowIfGeneric(); ThrowIfCreated(); tkType = m_module.GetTypeTokenInternal( eventtype ).Token; // Internal helpers to define property records evToken = new EventToken(DefineEvent( m_module.GetNativeHandle(), m_tdType.Token, name, attributes, tkType)); // create the property builder now. return new EventBuilder( m_module, name, attributes, //tkType, this, evToken); } #endregion #region Create Type [System.Security.SecuritySafeCritical] // auto-generated public Type CreateType() { lock(SyncRoot) { return CreateTypeNoLock(); } } internal void CheckContext(params Type[][] typess) { m_module.CheckContext(typess); } internal void CheckContext(params Type[] types) { m_module.CheckContext(types); } [System.Security.SecurityCritical] // auto-generated private Type CreateTypeNoLock() { if (IsCreated()) return m_runtimeType; ThrowIfGeneric(); ThrowIfCreated(); if (m_typeInterfaces == null) m_typeInterfaces = new List (); int[] interfaceTokens = new int[m_typeInterfaces.Count]; for(int i = 0; i < m_typeInterfaces.Count; i++) { interfaceTokens[i] = m_module.GetTypeTokenInternal(m_typeInterfaces[i]).Token; } int tkParent = 0; if (m_typeParent != null) tkParent = m_module.GetTypeTokenInternal(m_typeParent).Token; if (IsGenericParameter) { int[] constraints; // Array of token constrains terminated by null token if (m_typeParent != null) { constraints = new int[m_typeInterfaces.Count + 2]; constraints[constraints.Length - 2] = tkParent; } else { constraints = new int[m_typeInterfaces.Count + 1]; } for (int i = 0; i < m_typeInterfaces.Count; i++) { constraints[i] = m_module.GetTypeTokenInternal(m_typeInterfaces[i]).Token; } int declMember = m_declMeth == null ? m_DeclaringType.m_tdType.Token : m_declMeth.GetToken().Token; m_tdType = new TypeToken(DefineGenericParam(m_module.GetNativeHandle(), m_strName, declMember, m_genParamAttributes, m_genParamPos, constraints)); if (m_ca != null) { foreach (CustAttr ca in m_ca) ca.Bake(m_module, MetadataTokenInternal); } m_hasBeenCreated = true; return this; } else { // Check for global typebuilder if (((m_tdType.Token & 0x00FFFFFF) != 0) && ((tkParent & 0x00FFFFFF) != 0)) SetParentType(m_module.GetNativeHandle(), m_tdType.Token, tkParent); if (m_inst != null) foreach (Type tb in m_inst) if (tb is GenericTypeParameterBuilder) ((GenericTypeParameterBuilder)tb).m_type.CreateType(); } byte [] body; MethodAttributes methodAttrs; int maxstack; if (!m_isHiddenGlobalType) { // create a public default constructor if this class has no constructor. // except if the type is Interface, ValueType, Enum, or a static class. if (m_constructorCount == 0 && ((m_iAttr & TypeAttributes.Interface) == 0) && !IsValueType && ((m_iAttr & (TypeAttributes.Abstract | TypeAttributes.Sealed)) != (TypeAttributes.Abstract | TypeAttributes.Sealed))) { DefineDefaultConstructor(MethodAttributes.Public); } } int size = m_listMethods.Count; for(int i = 0; i < size; i++) { MethodBuilder meth = m_listMethods[i]; if (meth.IsGenericMethodDefinition) meth.GetToken(); // Doubles as "CreateMethod" for MethodBuilder -- analagous to CreateType() methodAttrs = meth.Attributes; // Any of these flags in the implemenation flags is set, we will not attach the IL method body if (((meth.GetMethodImplementationFlags() &(MethodImplAttributes.CodeTypeMask|MethodImplAttributes.PreserveSig|MethodImplAttributes.Unmanaged)) != MethodImplAttributes.IL) || ((methodAttrs & MethodAttributes.PinvokeImpl) !=(MethodAttributes) 0)) { continue; } int sigLength; byte[] localSig= meth.GetLocalsSignature().InternalGetSignature(out sigLength); // Check that they haven't declared an abstract method on a non-abstract class if (((methodAttrs & MethodAttributes.Abstract) != 0) &&((m_iAttr & TypeAttributes.Abstract) == 0)) { throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_BadTypeAttributesNotAbstract")); } body = meth.GetBody(); // If this is an abstract method or an interface, we don't need to set the IL. if ((methodAttrs & MethodAttributes.Abstract) != 0) { // We won't check on Interface because we can have class static initializer on interface. // We will just let EE or validator to catch the problem. //((m_iAttr & TypeAttributes.ClassSemanticsMask) == TypeAttributes.Interface)) if (body != null) throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_BadMethodBody")); } else if (body == null || body.Length == 0) { // If it's not an abstract or an interface, set the IL. if (meth.m_ilGenerator != null) { // we need to bake the method here. meth.CreateMethodBodyHelper(meth.GetILGenerator()); } body = meth.GetBody(); if ((body == null || body.Length == 0) && !meth.m_canBeRuntimeImpl) throw new InvalidOperationException( Environment.GetResourceString("InvalidOperation_BadEmptyMethodBody", meth.Name) ); } if (meth.m_ilGenerator != null) { maxstack = meth.m_ilGenerator.GetMaxStackSize() + meth.GetNumberOfExceptions(); } else { // this is the case when client provide an array of IL byte stream rather than going through ILGenerator. maxstack = 16; } __ExceptionInstance[] Exceptions = meth.GetExceptionInstances(); int[] TokenFixups = meth.GetTokenFixups(); int[] RVAFixups = meth.GetRVAFixups(); SetMethodIL(m_module.GetNativeHandle(), meth.GetToken().Token, meth.InitLocals, body, (body != null) ? body.Length : 0, localSig, sigLength, maxstack, Exceptions, (Exceptions != null) ? Exceptions.Length : 0, TokenFixups, (TokenFixups != null) ? TokenFixups.Length : 0, RVAFixups, (RVAFixups != null) ? RVAFixups.Length : 0); if (m_module.ContainingAssemblyBuilder.m_assemblyData.m_access == AssemblyBuilderAccess.Run) { // if we don't need the data structures to build the method any more // throw them away. meth.ReleaseBakedStructures(); } } m_hasBeenCreated = true; // Terminate the process. RuntimeType cls = null; TermCreateClass(m_module.GetNativeHandle(), m_tdType.Token, JitHelpers.GetObjectHandleOnStack(ref cls)); if (!m_isHiddenGlobalType) { m_runtimeType = cls; // if this type is a nested type, we need to invalidate the cached nested runtime type on the nesting type if (m_DeclaringType != null && m_DeclaringType.m_runtimeType != null) { ((RuntimeType)m_DeclaringType.m_runtimeType).InvalidateCachedNestedType(); } return cls; } else { return null; } } #endregion #region Misc public int Size { get { return m_iTypeSize; } } public PackingSize PackingSize { get { return m_iPackingSize; } } [System.Security.SecuritySafeCritical] // auto-generated public void SetParent(Type parent) { ThrowIfGeneric(); ThrowIfCreated(); if (parent != null) { CheckContext(parent); if (parent.IsInterface) throw new ArgumentException(Environment.GetResourceString("Argument_CannotSetParentToInterface")); m_typeParent = parent; } else { if ((m_iAttr & TypeAttributes.Interface) != TypeAttributes.Interface) { m_typeParent = typeof(Object); } else { if ((m_iAttr & TypeAttributes.Abstract) == 0) throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_BadInterfaceNotAbstract")); // there is no extends for interface class m_typeParent = null; } } } [System.Security.SecuritySafeCritical] // auto-generated [System.Runtime.InteropServices.ComVisible(true)] public void AddInterfaceImplementation(Type interfaceType) { if (interfaceType == null) { throw new ArgumentNullException("interfaceType"); } Contract.EndContractBlock(); ThrowIfGeneric(); CheckContext(interfaceType); ThrowIfCreated(); TypeToken tkInterface = m_module.GetTypeTokenInternal(interfaceType); AddInterfaceImpl(m_module.GetNativeHandle(), m_tdType.Token, tkInterface.Token); m_typeInterfaces.Add(interfaceType); } #if FEATURE_CAS_POLICY [System.Security.SecuritySafeCritical] // auto-generated public void AddDeclarativeSecurity(SecurityAction action, PermissionSet pset) { lock(SyncRoot) { AddDeclarativeSecurityNoLock(action, pset); } } [System.Security.SecurityCritical] // auto-generated private void AddDeclarativeSecurityNoLock(SecurityAction action, PermissionSet pset) { if (pset == null) throw new ArgumentNullException("pset"); #pragma warning disable 618 if (!Enum.IsDefined(typeof(SecurityAction), action) || action == SecurityAction.RequestMinimum || action == SecurityAction.RequestOptional || action == SecurityAction.RequestRefuse) { throw new ArgumentOutOfRangeException("action"); } #pragma warning restore 618 Contract.EndContractBlock(); ThrowIfGeneric(); ThrowIfCreated(); // Translate permission set into serialized format(uses standard binary serialization format). byte[] blob = null; int length = 0; if (!pset.IsEmpty()) { blob = pset.EncodeXml(); length = blob.Length; } // Write the blob into the metadata. AddDeclarativeSecurity(m_module.GetNativeHandle(), m_tdType.Token, action, blob, length); } #endif // FEATURE_CAS_POLICY public TypeToken TypeToken { get { if (IsGenericParameter) ThrowIfCreated(); return m_tdType; } } [System.Security.SecuritySafeCritical] // auto-generated [System.Runtime.InteropServices.ComVisible(true)] public void SetCustomAttribute(ConstructorInfo con, byte[] binaryAttribute) { if (con == null) throw new ArgumentNullException("con"); if (binaryAttribute == null) throw new ArgumentNullException("binaryAttribute"); Contract.EndContractBlock(); ThrowIfGeneric(); TypeBuilder.DefineCustomAttribute(m_module, m_tdType.Token, ((ModuleBuilder)m_module).GetConstructorToken(con).Token, binaryAttribute, false, false); } [System.Security.SecuritySafeCritical] // auto-generated public void SetCustomAttribute(CustomAttributeBuilder customBuilder) { if (customBuilder == null) throw new ArgumentNullException("customBuilder"); Contract.EndContractBlock(); ThrowIfGeneric(); customBuilder.CreateCustomAttribute((ModuleBuilder)m_module, m_tdType.Token); } #endregion #endregion void _TypeBuilder.GetTypeInfoCount(out uint pcTInfo) { throw new NotImplementedException(); } void _TypeBuilder.GetTypeInfo(uint iTInfo, uint lcid, IntPtr ppTInfo) { throw new NotImplementedException(); } void _TypeBuilder.GetIDsOfNames([In] ref Guid riid, IntPtr rgszNames, uint cNames, uint lcid, IntPtr rgDispId) { throw new NotImplementedException(); } void _TypeBuilder.Invoke(uint dispIdMember, [In] ref Guid riid, uint lcid, short wFlags, IntPtr pDispParams, IntPtr pVarResult, IntPtr pExcepInfo, IntPtr puArgErr) { throw new NotImplementedException(); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- RegexNode.cs
- BaseParaClient.cs
- SecurityTokenSerializer.cs
- CodeFieldReferenceExpression.cs
- AutomationEvent.cs
- Pool.cs
- InteropExecutor.cs
- KeyInterop.cs
- Merger.cs
- ToolboxItemCollection.cs
- MSAAEventDispatcher.cs
- Journal.cs
- OdbcException.cs
- ExpandSegmentCollection.cs
- CodeTypeParameter.cs
- VirtualizedItemProviderWrapper.cs
- MenuItemCollectionEditorDialog.cs
- CodeBlockBuilder.cs
- ExpandableObjectConverter.cs
- TemplateControl.cs
- DataServiceKeyAttribute.cs
- EdmTypeAttribute.cs
- ZoomingMessageFilter.cs
- PageStatePersister.cs
- TabletDevice.cs
- _AutoWebProxyScriptHelper.cs
- ScriptRef.cs
- OdbcEnvironmentHandle.cs
- AssemblyHelper.cs
- EventSetterHandlerConverter.cs
- StylusButton.cs
- xmlsaver.cs
- WbemProvider.cs
- Geometry.cs
- TextOptionsInternal.cs
- XmlStringTable.cs
- StringFunctions.cs
- PropertyValidationContext.cs
- MachineKeySection.cs
- TableItemStyle.cs
- ToolStripSystemRenderer.cs
- DelegateSerializationHolder.cs
- XmlSchemaSet.cs
- InternalMappingException.cs
- RayMeshGeometry3DHitTestResult.cs
- RandomNumberGenerator.cs
- BinaryVersion.cs
- StructuredTypeInfo.cs
- ToolStripPanelDesigner.cs
- Delegate.cs
- HttpApplication.cs
- PointCollection.cs
- SiteMapPath.cs
- DeclarativeCatalogPartDesigner.cs
- UndoEngine.cs
- SmiContext.cs
- ProfessionalColorTable.cs
- _SecureChannel.cs
- MachineSettingsSection.cs
- TimersDescriptionAttribute.cs
- ZoomComboBox.cs
- TraceHandlerErrorFormatter.cs
- XamlReader.cs
- EncodingDataItem.cs
- DesignerEventService.cs
- DataSourceHelper.cs
- EncryptedPackageFilter.cs
- EmptyEnumerator.cs
- Point3DValueSerializer.cs
- filewebresponse.cs
- DrawingDrawingContext.cs
- CalendarButtonAutomationPeer.cs
- InternalTransaction.cs
- ManualResetEvent.cs
- SizeFConverter.cs
- OptimisticConcurrencyException.cs
- DiscreteKeyFrames.cs
- Application.cs
- EventLogException.cs
- FontConverter.cs
- ExeConfigurationFileMap.cs
- DateTimeConverter.cs
- PointLight.cs
- DataSourceXmlSerializer.cs
- PagedDataSource.cs
- GridViewRowCollection.cs
- NativeMethods.cs
- XmlC14NWriter.cs
- PermissionToken.cs
- DBCommandBuilder.cs
- SecurityProtocolCorrelationState.cs
- RTLAwareMessageBox.cs
- CheckBoxAutomationPeer.cs
- Visual3D.cs
- MouseWheelEventArgs.cs
- XhtmlBasicCalendarAdapter.cs
- WebServiceEndpoint.cs
- PingReply.cs
- Padding.cs
- WpfSharedXamlSchemaContext.cs