The Labs \ Source Viewer \ SSCLI \ System.Reflection.Emit \ FieldBuilder

  1. // ==++==
  2. //
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. //
  14. // ==--==
  15. namespace System.Reflection.Emit
  16. {
  17.     using System.Runtime.InteropServices;
  18.     using System;
  19.     using CultureInfo = System.Globalization.CultureInfo;
  20.     using System.Reflection;
  21.     using System.Security.Permissions;
  22.    
  23.     [HostProtection(MayLeakOnAbort = true)]
  24.     [ClassInterface(ClassInterfaceType.None)]
  25.     [ComDefaultInterface(typeof(_FieldBuilder))]
  26.     [System.Runtime.InteropServices.ComVisible(true)]
  27.     public sealed class FieldBuilder : FieldInfo, _FieldBuilder
  28.     {
  29.         #region Private Data Members
  30.         private int m_fieldTok;
  31.         private FieldToken m_tkField;
  32.         private TypeBuilder m_typeBuilder;
  33.         private string m_fieldName;
  34.         private FieldAttributes m_Attributes;
  35.         private Type m_fieldType;
  36.         internal byte[] m_data;
  37.         #endregion
  38.        
  39.         #region Constructor
  40.         internal FieldBuilder(TypeBuilder typeBuilder, string fieldName, Type type, Type[] requiredCustomModifiers, Type[] optionalCustomModifiers, FieldAttributes attributes)
  41.         {
  42.             if (fieldName == null)
  43.                 throw new ArgumentNullException("fieldName");
  44.            
  45.             if (fieldName.Length == 0)
  46.                 throw new ArgumentException(Environment.GetResourceString("Argument_EmptyName"), "fieldName");
  47.            
  48.             if (fieldName[0] == '\0')
  49.                 throw new ArgumentException(Environment.GetResourceString("Argument_IllegalName"), "fieldName");
  50.            
  51.             if (type == null)
  52.                 throw new ArgumentNullException("type");
  53.            
  54.             if (type == typeof(void))
  55.                 throw new ArgumentException(Environment.GetResourceString("Argument_BadFieldType"));
  56.            
  57.             m_fieldName = fieldName;
  58.             m_typeBuilder = typeBuilder;
  59.             m_fieldType = type;
  60.             m_Attributes = attributes & ~FieldAttributes.ReservedMask;
  61.            
  62.             SignatureHelper sigHelp = SignatureHelper.GetFieldSigHelper(m_typeBuilder.Module);
  63.             sigHelp.AddArgument(type, requiredCustomModifiers, optionalCustomModifiers);
  64.            
  65.             int sigLength;
  66.             byte[] signature = sigHelp.InternalGetSignature(out sigLength);
  67.            
  68.             m_fieldTok = TypeBuilder.InternalDefineField(typeBuilder.TypeToken.Token, fieldName, signature, sigLength, m_Attributes, m_typeBuilder.Module);
  69.            
  70.             m_tkField = new FieldToken(m_fieldTok, type);
  71.         }
  72.        
  73.         #endregion
  74.        
  75.         #region Internal Members
  76.         internal void SetData(byte[] data, int size)
  77.         {
  78.             if (data != null) {
  79.                 m_data = new byte[data.Length];
  80.                 Array.Copy(data, m_data, data.Length);
  81.             }
  82.            
  83.             m_typeBuilder.Module.InternalSetFieldRVAContent(m_tkField.Token, data, size);
  84.         }
  85.        
  86.         internal TypeBuilder GetTypeBuilder()
  87.         {
  88.             return m_typeBuilder;
  89.         }
  90.         #endregion
  91.        
  92.         #region MemberInfo Overrides
  93.         internal override int MetadataTokenInternal {
  94.             get { return m_fieldTok; }
  95.         }
  96.        
  97.         public override Module Module {
  98.             get { return m_typeBuilder.Module; }
  99.         }
  100.        
  101.         public override string Name {
  102.             get { return m_fieldName; }
  103.         }
  104.        
  105.         public override Type DeclaringType {
  106.             get {
  107.                 if (m_typeBuilder.m_isHiddenGlobalType == true)
  108.                     return null;
  109.                
  110.                 return m_typeBuilder;
  111.             }
  112.         }
  113.        
  114.         public override Type ReflectedType {
  115.             get {
  116.                 if (m_typeBuilder.m_isHiddenGlobalType == true)
  117.                     return null;
  118.                
  119.                 return m_typeBuilder;
  120.             }
  121.         }
  122.        
  123.         #endregion
  124.        
  125.         #region FieldInfo Overrides
  126.         public override Type FieldType {
  127.             get { return m_fieldType; }
  128.         }
  129.        
  130.         public override object GetValue(object obj)
  131.         {
  132.             // NOTE!! If this is implemented, make sure that this throws
  133.             // a NotSupportedException for Save-only dynamic assemblies.
  134.             // Otherwise, it could cause the .cctor to be executed.
  135.            
  136.             throw new NotSupportedException(Environment.GetResourceString("NotSupported_DynamicModule"));
  137.         }
  138.        
  139.         public override void SetValue(object obj, object val, BindingFlags invokeAttr, Binder binder, CultureInfo culture)
  140.         {
  141.             // NOTE!! If this is implemented, make sure that this throws
  142.             // a NotSupportedException for Save-only dynamic assemblies.
  143.             // Otherwise, it could cause the .cctor to be executed.
  144.            
  145.             throw new NotSupportedException(Environment.GetResourceString("NotSupported_DynamicModule"));
  146.         }
  147.        
  148.         public override RuntimeFieldHandle FieldHandle {
  149.             get {
  150.                 throw new NotSupportedException(Environment.GetResourceString("NotSupported_DynamicModule"));
  151.             }
  152.         }
  153.        
  154.         public override FieldAttributes Attributes {
  155.             get { return m_Attributes; }
  156.         }
  157.        
  158.         #endregion
  159.        
  160.         #region ICustomAttributeProvider Implementation
  161.         public override object[] GetCustomAttributes(bool inherit)
  162.         {
  163.            
  164.             throw new NotSupportedException(Environment.GetResourceString("NotSupported_DynamicModule"));
  165.         }
  166.        
  167.         public override object[] GetCustomAttributes(Type attributeType, bool inherit)
  168.         {
  169.            
  170.             throw new NotSupportedException(Environment.GetResourceString("NotSupported_DynamicModule"));
  171.         }
  172.        
  173.         public override bool IsDefined(Type attributeType, bool inherit)
  174.         {
  175.            
  176.             throw new NotSupportedException(Environment.GetResourceString("NotSupported_DynamicModule"));
  177.         }
  178.        
  179.         #endregion
  180.        
  181.         #region Public Members
  182.         public FieldToken GetToken()
  183.         {
  184.             return m_tkField;
  185.         }
  186.        
  187.         public void SetOffset(int iOffset)
  188.         {
  189.             m_typeBuilder.ThrowIfCreated();
  190.            
  191.             TypeBuilder.InternalSetFieldOffset(m_typeBuilder.Module, GetToken().Token, iOffset);
  192.         }
  193.        
  194.         [Obsolete("An alternate API is available: Emit the MarshalAs custom attribute instead. http://go.microsoft.com/fwlink/?linkid=14202")]
  195.         public void SetMarshal(UnmanagedMarshal unmanagedMarshal)
  196.         {
  197.             m_typeBuilder.ThrowIfCreated();
  198.            
  199.             if (unmanagedMarshal == null)
  200.                 throw new ArgumentNullException("unmanagedMarshal");
  201.            
  202.             byte[] ubMarshal = unmanagedMarshal.InternalGetBytes();
  203.            
  204.             TypeBuilder.InternalSetMarshalInfo(m_typeBuilder.Module, GetToken().Token, ubMarshal, ubMarshal.Length);
  205.         }
  206.        
  207.         public void SetConstant(object defaultValue)
  208.         {
  209.             m_typeBuilder.ThrowIfCreated();
  210.            
  211.             TypeBuilder.SetConstantValue(m_typeBuilder.Module, GetToken().Token, m_fieldType, defaultValue);
  212.         }
  213.        
  214.         [System.Runtime.InteropServices.ComVisible(true)]
  215.         public void SetCustomAttribute(ConstructorInfo con, byte[] binaryAttribute)
  216.         {
  217.             ModuleBuilder module = m_typeBuilder.Module as ModuleBuilder;
  218.            
  219.             m_typeBuilder.ThrowIfCreated();
  220.            
  221.             if (con == null)
  222.                 throw new ArgumentNullException("con");
  223.            
  224.             if (binaryAttribute == null)
  225.                 throw new ArgumentNullException("binaryAttribute");
  226.            
  227.             TypeBuilder.InternalCreateCustomAttribute(m_tkField.Token, module.GetConstructorToken(con).Token, binaryAttribute, module, false);
  228.         }
  229.        
  230.         public void SetCustomAttribute(CustomAttributeBuilder customBuilder)
  231.         {
  232.             m_typeBuilder.ThrowIfCreated();
  233.            
  234.             if (customBuilder == null)
  235.                 throw new ArgumentNullException("customBuilder");
  236.            
  237.             ModuleBuilder module = m_typeBuilder.Module as ModuleBuilder;
  238.            
  239.             customBuilder.CreateCustomAttribute(module, m_tkField.Token);
  240.         }
  241.        
  242.         #endregion
  243.        
  244.         void _FieldBuilder.GetTypeInfoCount(out uint pcTInfo)
  245.         {
  246.             throw new NotImplementedException();
  247.         }
  248.        
  249.         void _FieldBuilder.GetTypeInfo(uint iTInfo, uint lcid, IntPtr ppTInfo)
  250.         {
  251.             throw new NotImplementedException();
  252.         }
  253.        
  254.         void _FieldBuilder.GetIDsOfNames(        [In()]
  255. ref Guid riid, IntPtr rgszNames, uint cNames, uint lcid, IntPtr rgDispId)
  256.         {
  257.             throw new NotImplementedException();
  258.         }
  259.        
  260.         void _FieldBuilder.Invoke(uint dispIdMember,         [In()]
  261. ref Guid riid, uint lcid, short wFlags, IntPtr pDispParams, IntPtr pVarResult, IntPtr pExcepInfo, IntPtr puArgErr)
  262.         {
  263.             throw new NotImplementedException();
  264.         }
  265.     }
  266. }

Developer Fusion