CustomAttributeBuilder.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. //
  2. // System.Reflection.Emit/CustomAttributeBuilder.cs
  3. //
  4. // Author:
  5. // Paolo Molaro ([email protected])
  6. //
  7. // (C) 2001 Ximian, Inc. http://www.ximian.com
  8. //
  9. using System;
  10. using System.Reflection;
  11. using System.Reflection.Emit;
  12. using System.Runtime.CompilerServices;
  13. using System.Runtime.InteropServices;
  14. namespace System.Reflection.Emit {
  15. public class CustomAttributeBuilder {
  16. ConstructorInfo ctor;
  17. byte[] data;
  18. internal ConstructorInfo Ctor {
  19. get {return ctor;}
  20. }
  21. internal byte[] Data {
  22. get {return data;}
  23. }
  24. [MethodImplAttribute(MethodImplOptions.InternalCall)]
  25. static extern byte[] GetBlob(ConstructorInfo con, object[] constructorArgs, PropertyInfo[] namedProperties, object[] propertyValues, FieldInfo[] namedFields, object[] fieldValues);
  26. internal CustomAttributeBuilder( ConstructorInfo con, byte[] cdata) {
  27. ctor = con;
  28. data = (byte[])cdata.Clone ();
  29. /* should we check that the user supplied data is correct? */
  30. }
  31. public CustomAttributeBuilder( ConstructorInfo con, object[] constructorArgs)
  32. : this (con, constructorArgs, null, null, null, null) {
  33. }
  34. public CustomAttributeBuilder( ConstructorInfo con, object[] constructorArgs, FieldInfo[] namedFields, object[] fieldValues)
  35. : this (con, constructorArgs, null, null, namedFields, fieldValues) {
  36. }
  37. public CustomAttributeBuilder( ConstructorInfo con, object[] constructorArgs, PropertyInfo[] namedProperties, object[] propertyValues)
  38. : this (con, constructorArgs, namedProperties, propertyValues, null, null) {
  39. }
  40. public CustomAttributeBuilder( ConstructorInfo con, object[] constructorArgs, PropertyInfo[] namedProperties, object[] propertyValues, FieldInfo[] namedFields, object[] fieldValues) {
  41. ctor = con;
  42. data = GetBlob (con, constructorArgs, namedProperties, propertyValues, namedFields, fieldValues);
  43. }
  44. /* helper methods */
  45. internal static int decode_len (byte[] data, int pos, out int rpos) {
  46. int len = 0;
  47. if ((data [pos] & 0x80) == 0) {
  48. len = (int)(data [pos++] & 0x7f);
  49. } else if ((data [pos] & 0x40) == 0) {
  50. len = ((data [pos] & 0x3f) << 8) + data [pos + 1];
  51. pos += 2;
  52. } else {
  53. len = ((data [pos] & 0x1f) << 24) + (data [pos + 1] << 16) + (data [pos + 2] << 8) + data [pos + 3];
  54. pos += 4;
  55. }
  56. rpos = pos;
  57. return len;
  58. }
  59. internal static string string_from_bytes (byte[] data, int pos, int len)
  60. {
  61. return System.Text.Encoding.UTF8.GetString(data, pos, len);
  62. }
  63. internal static UnmanagedMarshal get_umarshal (CustomAttributeBuilder customBuilder, bool is_field) {
  64. byte[] data = customBuilder.Data;
  65. UnmanagedType subtype = UnmanagedType.I4;
  66. int sizeConst = 0;
  67. int value;
  68. int utype; /* the (stupid) ctor takes a short or an enum ... */
  69. utype = (int)data [2];
  70. utype |= ((int)data [3]) << 8;
  71. string first_type_name = customBuilder.Ctor.GetParameters()[0].ParameterType.FullName;
  72. int pos = 6;
  73. if (first_type_name == "System.Int16")
  74. pos = 4;
  75. int nnamed = (int)data [pos++];
  76. nnamed |= ((int)data [pos++]) << 8;
  77. for (int i = 0; i < nnamed; ++i) {
  78. int paramType; // What is this ?
  79. paramType = (int)data [pos++];
  80. paramType |= ((int)data [pos++]) << 8;
  81. int len = decode_len (data, pos, out pos);
  82. string named_name = string_from_bytes (data, pos, len);
  83. pos += len;
  84. switch (named_name) {
  85. case "ArraySubType":
  86. value = (int)data [pos++];
  87. value |= ((int)data [pos++]) << 8;
  88. value |= ((int)data [pos++]) << 16;
  89. value |= ((int)data [pos++]) << 24;
  90. subtype = (UnmanagedType)value;
  91. break;
  92. case "SizeConst":
  93. value = (int)data [pos++];
  94. value |= ((int)data [pos++]) << 8;
  95. value |= ((int)data [pos++]) << 16;
  96. value |= ((int)data [pos++]) << 24;
  97. sizeConst = value;
  98. break;
  99. default:
  100. break;
  101. }
  102. }
  103. switch ((UnmanagedType)utype) {
  104. case UnmanagedType.LPArray:
  105. return UnmanagedMarshal.DefineLPArray (subtype);
  106. case UnmanagedType.SafeArray:
  107. return UnmanagedMarshal.DefineSafeArray (subtype);
  108. case UnmanagedType.ByValArray:
  109. return UnmanagedMarshal.DefineByValArray (sizeConst);
  110. case UnmanagedType.ByValTStr:
  111. return UnmanagedMarshal.DefineByValTStr (sizeConst);
  112. default:
  113. return UnmanagedMarshal.DefineUnmanagedMarshal ((UnmanagedType)utype);
  114. }
  115. }
  116. }
  117. }