コード例 #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);
        }