Thank you! Looks like a little bit strange )

Do I understand correctly that the instantiated generic types should
not be added to declaringtype?

For ex., I cannot see method body copying, or adding resulting
MethodReference to any type. It just called. Why?

        public static MethodReference MakeHostInstanceGeneric(this
MethodReference self, TypeReference type)
        {
            var m = new MethodReference(self.Name, self.ReturnType,
type)
            {
                HasThis = self.HasThis,
                ExplicitThis = self.ExplicitThis,
                CallingConvention = self.CallingConvention
            };
            foreach (var p in self.Parameters)
                m.Parameters.Add(new
ParameterDefinition(p.ParameterType));
            foreach (var p in self.GenericParameters)
                m.GenericParameters.Add(p);

            return m;
        }

Stanislav

On 19 май, 10:42, seesharper <[email protected]> wrote:
> I had a similar problem.
>
> Take a look at this discussion
>
> http://groups.google.com/group/mono-cecil/browse_thread/thread/9826ad...
>
> Regards
>
> Bernhard Richter
>
> On May 18, 9:16 am, Stanislav <[email protected]> wrote:
>
>
>
>
>
>
>
> > Hi!
>
> > I cant understand, what I need to do to create generic type, emit
> > creating and emit generic method call of newly created type. In my
> > case I need to create delegate to generic method.
> > My steps:
>
> >    Create TypeDefinition of delegate extends MulticastDelegate
>
> >             // Create new delegate type
> >             var dlgtype = new
> > TypeDefinition(method.DeclaringType.Namespace, method.Name +
> > "_Delegate", TypeAttributes.Sealed | TypeAttributes.NestedAssembly,
> > _MulticastDelegate);
>
> >             delegateClass.NestedTypes.Add(dlgtype);
>
> >    Copy all GenericParams from method to newly created TypeDefinition
>
> >             if(method.DeclaringType.HasGenericParameters)
> >             {
> >                 method.DeclaringType.CopyGenericParametersTo(dlgtype);
> >             }
>
> >    Create .ctor
>
> >             var constructor = new MethodDefinition(".ctor",
> > MethodAttributes.Public | MethodAttributes.CompilerControlled |
> > MethodAttributes.RTSpecialName | MethodAttributes.SpecialName |
> > MethodAttributes.HideBySig, _Void);
> >             dlgtype.Methods.Add(constructor);
> >             constructor.Parameters.Add(new
> > ParameterDefinition("'object'", ParameterAttributes.None, _Object));
> >             constructor.Parameters.Add(new
> > ParameterDefinition("'method'", ParameterAttributes.None, _IntPtr));
> >             constructor.IsRuntime = true;
>
> >    Create BeginInvoke using parameters types map (generic params from
> > original method to generic params from delegate type)
> >             var begininvoke = new MethodDefinition("BeginInvoke",
> > methodAttributes, _IAsyncResult);
> >             dlgtype.Methods.Add(begininvoke);
> >             foreach(var para in template.Parameters)
> >             {
> >                 if (!para.ParameterType.IsGenericParameter)
> >                 {
> >                     begininvoke.Parameters.Add(new
> > ParameterDefinition(para.Name, para.Attributes, para.ParameterType));
> >                 }
> >                 else
> >                 {
> >                     var type =
> > dlgtype.GenericParameters.FirstOrDefault(p => p.Name ==
> > para.ParameterType.Name);
> >                     if(type != null)
> >                     {
> >                         begininvoke.Parameters.Add(new
> > ParameterDefinition(para.Name, para.Attributes, type));
> >                     }
> >                 }
> >             }
> >             begininvoke.Parameters.Add(new
> > ParameterDefinition("callback", ParameterAttributes.None,
> > _AsyncCallback));
> >             begininvoke.Parameters.Add(new
> > ParameterDefinition("object", ParameterAttributes.None, _Object));
> >             begininvoke.IsRuntime = true;
> >    Create Iinvoke method
> >             // ...
>
> > Emit something like this:
> >             worker.InsertBefore(fst,
> > Instruction.Create(target.HasThis ? OpCodes.Ldarg_0 :
> > OpCodes.Ldnull));
> >             worker.InsertBefore(fst, Instruction.Create(OpCodes.Ldftn,
> > duplicate));
> >             worker.InsertBefore(fst,
> > Instruction.Create(OpCodes.Newobj, constructor));
> >             worker.InsertBefore(fst, Instruction.Create(OpCodes.Stloc,
> > dupdlg));
> > to create delegate
>
> > BUT. When I try to create delegate, I get System.TypeLoadException.
> > What's wrong?
>
> > Thanks.

-- 
--
mono-cecil

Reply via email to