Hi Manuel, Can you show the IL that the compiler outputs and that you want to output using Cecil?
Thanks, Jb On Thu, Aug 6, 2015 at 7:38 PM, Manuel Eisenschink <[email protected]> wrote: > Hello, > > my current task is to find & edit or create the finalizer for a certain > class. > In this case there is no finalizer defined, so the base-finalizer > (System.Object) will be used, of course. > > I now have to override that Finalizer. I looked up a few solutions which > all are obviously outdated (<2011). > When I re-compile my assemblies with Cecil, I get the following CIL output: > > .method family hidebysig virtual instance void > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://mscorlib:4.0.0.0:b77a5c561934e089/System.Void> > *Finalize > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://VisualBug.Lab.Forms:1.0.0.0/VisualBug.Lab.Forms.MainWindow/Finalize()>*() > cil managed > { > .maxstack 8 > L_0000: ldarg.0 > L_0001: call instance class [mscorlib > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://mscorlib:4.0.0.0:b77a5c561934e089>]System.Type > > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://mscorlib:4.0.0.0:b77a5c561934e089/System.Type> > [mscorlib > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://mscorlib:4.0.0.0:b77a5c561934e089>]System.Object > > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://mscorlib:4.0.0.0:b77a5c561934e089/System.Object>::GetType > > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://mscorlib:4.0.0.0:b77a5c561934e089/System.Object/GetType():System.Type>() > L_0006: ldarg.0 > L_0007: ldfld class [App > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://VisualBug.BugSpy:1.1.0.0:dce65d1ef2e32103>]App.Instancing.InstanceId > > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://VisualBug.BugSpy:1.1.0.0:dce65d1ef2e32103/VisualBug.BugSpy.Instancing.InstanceId> > App.Forms.MainWindow > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://VisualBug.Lab.Forms:1.0.0.0/VisualBug.Lab.Forms.MainWindow>::vbbgsMtrInsVr0221 > > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://VisualBug.Lab.Forms:1.0.0.0/VisualBug.Lab.Forms.MainWindow/vbbgsMtrInsVr0221:VisualBug.BugSpy.Instancing.InstanceId> > L_000c: call bool > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://mscorlib:4.0.0.0:b77a5c561934e089/System.Boolean> > [App > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://VisualBug.BugSpy:1.1.0.0:dce65d1ef2e32103>]App.Spy > > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://VisualBug.BugSpy:1.1.0.0:dce65d1ef2e32103/VisualBug.BugSpy.Spy>::UnsetToken > > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://VisualBug.BugSpy:1.1.0.0:dce65d1ef2e32103/VisualBug.BugSpy.Spy/UnsetToken(System.Type,VisualBug.BugSpy.Instancing.InstanceId):Boolean>(class > [mscorlib > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://mscorlib:4.0.0.0:b77a5c561934e089>]System.Type > > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://mscorlib:4.0.0.0:b77a5c561934e089/System.Type>, > class [App > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://VisualBug.BugSpy:1.1.0.0:dce65d1ef2e32103>]App.Instancing.InstanceId > > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://VisualBug.BugSpy:1.1.0.0:dce65d1ef2e32103/VisualBug.BugSpy.Instancing.InstanceId>) > L_0011: pop > L_0012: ldarg.0 > L_0013: call instance void > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://mscorlib:4.0.0.0:b77a5c561934e089/System.Void> > [mscorlib > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://mscorlib:4.0.0.0:b77a5c561934e089>]System.Object > > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://mscorlib:4.0.0.0:b77a5c561934e089/System.Object>::Finalize > > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://mscorlib:4.0.0.0:b77a5c561934e089/System.Object/Finalize()>() > } > > > > > > > > > .method family hidebysig virtual instance void > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://mscorlib:4.0.0.0:b77a5c561934e089/System.Void> > *Finalize > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://VisualBug.Lab.Forms:1.0.0.0/VisualBug.Lab.Forms.MainWindow/Finalize()>*() > cil managed > { > .maxstack 8 > L_0000: ldarg.0 > L_0001: call instance class [mscorlib > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://mscorlib:4.0.0.0:b77a5c561934e089>]System.Type > > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://mscorlib:4.0.0.0:b77a5c561934e089/System.Type> > [mscorlib > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://mscorlib:4.0.0.0:b77a5c561934e089>]System.Object > > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://mscorlib:4.0.0.0:b77a5c561934e089/System.Object>::GetType > > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://mscorlib:4.0.0.0:b77a5c561934e089/System.Object/GetType():System.Type>() > L_0006: ldarg.0 > L_0007: ldfld class [VisualBug.BugSpy > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://VisualBug.BugSpy:1.1.0.0:dce65d1ef2e32103>]VisualBug.BugSpy.Instancing.InstanceId > > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://VisualBug.BugSpy:1.1.0.0:dce65d1ef2e32103/VisualBug.BugSpy.Instancing.InstanceId> > VisualBug.Lab.Forms.MainWindow > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://VisualBug.Lab.Forms:1.0.0.0/VisualBug.Lab.Forms.MainWindow>::vbbgsMtrInsVr0221 > > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://VisualBug.Lab.Forms:1.0.0.0/VisualBug.Lab.Forms.MainWindow/vbbgsMtrInsVr0221:VisualBug.BugSpy.Instancing.InstanceId> > L_000c: call bool > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://mscorlib:4.0.0.0:b77a5c561934e089/System.Boolean> > [VisualBug.BugSpy > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://VisualBug.BugSpy:1.1.0.0:dce65d1ef2e32103>]VisualBug.BugSpy.Spy > > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://VisualBug.BugSpy:1.1.0.0:dce65d1ef2e32103/VisualBug.BugSpy.Spy>::UnsetToken > > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://VisualBug.BugSpy:1.1.0.0:dce65d1ef2e32103/VisualBug.BugSpy.Spy/UnsetToken(System.Type,VisualBug.BugSpy.Instancing.InstanceId):Boolean>(class > [mscorlib > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://mscorlib:4.0.0.0:b77a5c561934e089>]System.Type > > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://mscorlib:4.0.0.0:b77a5c561934e089/System.Type>, > class [VisualBug.BugSpy > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://VisualBug.BugSpy:1.1.0.0:dce65d1ef2e32103>]VisualBug.BugSpy.Instancing.InstanceId > > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://VisualBug.BugSpy:1.1.0.0:dce65d1ef2e32103/VisualBug.BugSpy.Instancing.InstanceId>) > L_0011: pop > L_0012: ldarg.0 > L_0013: call instance void > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://mscorlib:4.0.0.0:b77a5c561934e089/System.Void> > [mscorlib > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://mscorlib:4.0.0.0:b77a5c561934e089>]System.Object > > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://mscorlib:4.0.0.0:b77a5c561934e089/System.Object>::Finalize > > <http://127.0.0.1/roeder/dotnet/Default.aspx?Target=code://mscorlib:4.0.0.0:b77a5c561934e089/System.Object/Finalize()>() > } > > > When I take a look at the same method generated by the compiler, there is > a lot more. I guess the Try-Finally stuff is not necessary but probably > recommended. > But what is clearly missing is the *.override* IL instruction. > > This is the code that generates the override: > > destructor = new MethodDefinition("Finalize", > MethodAttributes.Family | MethodAttributes.HideBySig | > MethodAttributes.Virtual | > MethodAttributes.ReuseSlot, module.Import(typeof (void))); > baseType.Methods.Add(destructor); > > > > How can I achieve this? I don't understand why this won't become a valid > override. Every answer on StackOverflow mentioned just > those few attributes which have to be set in order to get it working. > Obviously that's not enough or has been changed over time (just old > answers). > > > Thanks :) > > -- > -- > -- > mono-cecil > --- > You received this message because you are subscribed to the Google Groups > "mono-cecil" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. > -- -- -- mono-cecil --- You received this message because you are subscribed to the Google Groups "mono-cecil" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
