Advertisement
Guest User

Untitled

a guest
Apr 27th, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.21 KB | None | 0 0
  1. #region Module Builder
  2. $Domain = [AppDomain]::CurrentDomain
  3. $DynAssembly = New-Object System.Reflection.AssemblyName(([guid]::NewGuid().ToString()))
  4. $AssemblyBuilder = $Domain.DefineDynamicAssembly($DynAssembly, [System.Reflection.Emit.AssemblyBuilderAccess]::Run) # Only run in memory
  5. $ModuleBuilder = $AssemblyBuilder.DefineDynamicModule(([guid]::NewGuid().ToString()), $False)
  6. #endregion Module Builder
  7. #region STRUCTs
  8. #Order of creating these Structs is important
  9. #region MyStruct
  10. $Attributes = 'AutoLayout, AnsiClass, Class, Public, SequentialLayout, Sealed, BeforeFieldInit'
  11. $STRUCT_TypeBuilder = $ModuleBuilder.DefineType('Person', $Attributes, [System.ValueType], 8)
  12. $FirstName_Field = $STRUCT_TypeBuilder.DefineField('FirstName', [string], 'Public')
  13. $LastName_Field = $STRUCT_TypeBuilder.DefineField('LastName', [string], 'Public')
  14. $Age_Field = $STRUCT_TypeBuilder.DefineField('Age', [int], 'Public')
  15.  
  16. #region Constructors
  17. #Default Constructor
  18. $ObjType = [Type]::GetType('System.Object')
  19. $ctor = $ObjType.GetConstructor([type]::EmptyTypes)
  20. $ConstructorBuilder = $STRUCT_TypeBuilder.DefineConstructor('Public', [System.Reflection.CallingConventions]::Standard, @())
  21. $ILGen = $ConstructorBuilder.GetILGenerator()
  22. $ILGen.Emit([Reflection.Emit.OpCodes]::Ldarg,0)
  23. $ILGen.Emit([Reflection.Emit.OpCodes]::Call, $ctor)
  24. $ILGen.Emit([Reflection.Emit.OpCodes]::Ret)
  25.  
  26. #First, Last and Age Constructor
  27. $ObjType = [Type]::GetType('System.Object')
  28. $ctor = $ObjType.GetConstructor([type]::EmptyTypes)
  29. $ConstructorBuilder = $STRUCT_TypeBuilder.DefineConstructor('Public', [System.Reflection.CallingConventions]::Standard, @([string], [string], [int]))
  30. $ILGen = $ConstructorBuilder.GetILGenerator()
  31. $ILGen.Emit([Reflection.Emit.OpCodes]::Ldarg,0)
  32. $ILGen.Emit([Reflection.Emit.OpCodes]::Call, $ctor)
  33. $ILGen.Emit([Reflection.Emit.OpCodes]::Ldarg, 0)
  34. $ILGen.Emit([Reflection.Emit.OpCodes]::Ldarg, 1)
  35. $ILGen.Emit([Reflection.Emit.OpCodes]::Stfld, $FirstName_Field)
  36. $ILGen.Emit([Reflection.Emit.OpCodes]::Ldarg, 0)
  37. $ILGen.Emit([Reflection.Emit.OpCodes]::Ldarg, 2)
  38. $ILGen.Emit([Reflection.Emit.OpCodes]::Stfld, $LastName_Field)
  39. $ILGen.Emit([Reflection.Emit.OpCodes]::Ldarg, 0)
  40. $ILGen.Emit([Reflection.Emit.OpCodes]::Ldarg, 3)
  41. $ILGen.Emit([Reflection.Emit.OpCodes]::Stfld, $Age_Field)
  42. $ILGen.Emit([Reflection.Emit.OpCodes]::Ret)
  43. #endregion Constructors
  44.  
  45. #region Methods
  46. #FirstName
  47. $Method = $STRUCT_TypeBuilder.DefineMethod('_GetFirstName','Private', ([int]), $Null)
  48. $MethodIL = $Method.GetILGenerator()
  49. $MethodIL.Emit([Reflection.Emit.OpCodes]::Ldfld, $FirstName_Field)
  50. $MethodIL.Emit([Reflection.Emit.OpCodes]::Ret)
  51.  
  52. #LastName
  53. $Method = $STRUCT_TypeBuilder.DefineMethod('_GetLastName','Private', ([int]), $Null)
  54. $MethodIL = $Method.GetILGenerator()
  55. $MethodIL.Emit([Reflection.Emit.OpCodes]::Ldfld, $LastName_Field)
  56. $MethodIL.Emit([Reflection.Emit.OpCodes]::Ret)
  57.  
  58. #Age
  59. $Method = $STRUCT_TypeBuilder.DefineMethod('_GetAge','Private', ([int]), $Null)
  60. $MethodIL = $Method.GetILGenerator()
  61. $MethodIL.Emit([Reflection.Emit.OpCodes]::Ldfld, $Age_Field)
  62. $MethodIL.Emit([Reflection.Emit.OpCodes]::Ret)
  63. #endregion Methods
  64.  
  65. [void]$STRUCT_TypeBuilder.CreateType()
  66. #endregion MyStruct
  67.  
  68. #Test it out
  69. [Person]::New('Boe','Prox',36)
  70. <#
  71. FirstName LastName Age
  72. --------- -------- ---
  73. Boe Prox 36
  74. #>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement