code_junkie

Why would a typebuilder spit out two .ctor methods?

Nov 12th, 2011
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.28 KB | None | 0 0
  1. Public Sub ctor(ByVal type As TypeBuilder, ByVal FieldRefs As Dictionary(Of Type, FieldBuilder))
  2. ' Method attributes
  3. Dim methodAttributes As System.Reflection.MethodAttributes = MethodAttributes.[Public]
  4.  
  5. Dim method As MethodBuilder = type.DefineMethod(".ctor", methodAttributes)
  6. ' Preparing Reflection instances
  7.  
  8. Dim ctor1 As ConstructorInfo = GetType(Object).GetConstructor(BindingFlags.Instance Or BindingFlags.[Public] Or BindingFlags.NonPublic, Nothing, Nothing, Nothing)
  9.  
  10. ' Setting return type
  11. method.SetReturnType(GetType(Void))
  12. ' Adding parameters
  13. Dim gen As ILGenerator = method.GetILGenerator()
  14. ' Writing body
  15. gen.Emit(OpCodes.Ldarg_0)
  16. gen.Emit(OpCodes.[Call], ctor1)
  17.  
  18. 'new up fields
  19. For Each item In FieldRefs
  20. AddCtor(type, gen, item.Value, item.Key)
  21. Next
  22.  
  23. gen.Emit(OpCodes.Ret)
  24.  
  25. ' finished
  26. End Sub
  27.  
  28.  
  29. Private Sub AddCtor(ByVal type As TypeBuilder, ByVal gen As ILGenerator, ByVal FieldBuilderRef As FieldBuilder, ByVal TypeToReference As Type)
  30. Dim TypeCtor = TypeToReference.GetConstructor(BindingFlags.Instance Or BindingFlags.[Public] Or BindingFlags.NonPublic, Nothing, New Type() {}, Nothing)
  31. gen.Emit(OpCodes.Ldarg_0)
  32. gen.Emit(OpCodes.Newobj, TypeCtor)
  33. gen.Emit(OpCodes.Stfld, FieldBuilderRef)
  34. End Sub
Add Comment
Please, Sign In to add comment