Beispiel #1
0
        // Constructor.
        internal ConstructorBuilder(TypeBuilder type, String name,
                                    MethodAttributes attributes,
                                    CallingConventions callingConvention,
                                    Type[] parameterTypes)
        {
            // Validate the parameters.
            if (name == null)
            {
                throw new ArgumentNullException("name");
            }
            else if (name == String.Empty)
            {
                throw new ArgumentException(_("Emit_NameEmpty"));
            }
            if ((attributes & MethodAttributes.Static) == 0)
            {
                callingConvention |= CallingConventions.HasThis;
            }
            if ((attributes & MethodAttributes.Virtual) != 0)
            {
                throw new ArgumentException(/* TODO */);
            }
            attributes |= MethodAttributes.SpecialName;
            attributes |= MethodAttributes.RTSpecialName;

            // Set the internal state.
            this.type      = type;
            this.numParams = (parameterTypes != null
                                                                        ? parameterTypes.Length : 0);
            this.ilGenerator = null;
            this.initLocals  = true;

            // Register this item to be detached later.
            type.module.assembly.AddDetach(this);

            // Create the signature.
            helper = SignatureHelper.GetMethodSigHelper
                         (type.module, callingConvention,
                         (CallingConvention)0,
                         typeof(void), parameterTypes);

            // Create the constructor method.
            lock (typeof(AssemblyBuilder))
            {
                this.privateData = MethodBuilder.ClrMethodCreate
                                       (((IClrProgramItem)type).ClrHandle, name,
                                       attributes, helper.sig);
            }

            // Add the constructor to the type for post-processing.
            type.AddMethod(this);
        }
Beispiel #2
0
        // Constructor.
        internal MethodBuilder(TypeBuilder type, String name,
                               MethodAttributes attributes,
                               CallingConventions callingConvention,
                               Type returnType, Type[] parameterTypes)
        {
            // Validate the parameters.
            if (name == null)
            {
                throw new ArgumentNullException("name");
            }
            else if (name == String.Empty)
            {
                throw new ArgumentException(_("Emit_NameEmpty"));
            }
            if (returnType == null)
            {
                returnType = typeof(void);
            }
            if ((attributes & MethodAttributes.Static) == 0)
            {
                callingConvention |= CallingConventions.HasThis;
            }
            else if ((attributes & MethodAttributes.Virtual) != 0)
            {
                throw new ArgumentException
                          (_("Emit_BothStaticAndVirtual"));
            }
            if ((type.Attributes & TypeAttributes.ClassSemanticsMask)
                == TypeAttributes.Interface &&
                (attributes & MethodAttributes.SpecialName) == 0)
            {
                if ((attributes & (MethodAttributes.Virtual |
                                   MethodAttributes.Abstract))
                    != (MethodAttributes.Virtual |
                        MethodAttributes.Abstract))
                {
                    throw new ArgumentException
                              (_("Emit_InterfaceMethodAttrs"));
                }
            }

            // Set the local state.
            this.type          = type;
            this.bodySet       = false;
            this.initLocals    = true;
            this.explicitBody  = null;
            this.ilGenerator   = null;
            this.returnType    = returnType;
            this.returnBuilder = null;
            this.numParams     = (parameterTypes != null
                                                                        ? parameterTypes.Length : 0);

            // Register this item to be detached later.
            type.module.assembly.AddDetach(this);

            // Create the method signature.
            helper = SignatureHelper.GetMethodSigHelper
                         (type.module, callingConvention,
                         (CallingConvention)0,
                         returnType, parameterTypes);

            // Create the method.
            lock (typeof(AssemblyBuilder))
            {
                this.privateData = ClrMethodCreate
                                       (((IClrProgramItem)type).ClrHandle, name,
                                       attributes, helper.sig);
            }

            // Add the method to the type for post-processing.
            type.AddMethod(this);
        }
	// Constructor.
	internal ConstructorBuilder(TypeBuilder type, String name,
								MethodAttributes attributes,
				 				CallingConventions callingConvention,
				 				Type[] parameterTypes)
			{
				// Validate the parameters.
				if(name == null)
				{
					throw new ArgumentNullException("name");
				}
				else if(name == String.Empty)
				{
					throw new ArgumentException(_("Emit_NameEmpty"));
				}
				if((attributes & MethodAttributes.Static) == 0)
				{
					callingConvention |= CallingConventions.HasThis;
				}
				if((attributes & MethodAttributes.Virtual) != 0)
				{
					throw new ArgumentException(/* TODO */);
				}
				attributes |= MethodAttributes.SpecialName;
				attributes |= MethodAttributes.RTSpecialName;

				// Set the internal state.
				this.type = type;
				this.numParams = (parameterTypes != null
									? parameterTypes.Length : 0);
				this.ilGenerator = null;
				this.initLocals = true;

				// Register this item to be detached later.
				type.module.assembly.AddDetach(this);

				// Create the signature.
				helper = SignatureHelper.GetMethodSigHelper
						(type.module, callingConvention,
						 (CallingConvention)0,
						 typeof(void), parameterTypes);

				// Create the constructor method.
				lock(typeof(AssemblyBuilder))
				{
					this.privateData = MethodBuilder.ClrMethodCreate
						(((IClrProgramItem)type).ClrHandle, name,
						 attributes, helper.sig);
				}

				// Add the constructor to the type for post-processing.
				type.AddMethod(this);
			}