Code:
/ FXUpdate3074 / FXUpdate3074 / 1.1 / untmp / whidbey / QFE / ndp / clr / src / BCL / System / Reflection / Emit / AssemblyBuilderData.cs / 4 / AssemblyBuilderData.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// namespace System.Reflection.Emit { using System; using IList = System.Collections.IList; using ArrayList = System.Collections.ArrayList; using System.Reflection; using System.Security; using System.Diagnostics; using CultureInfo = System.Globalization.CultureInfo; using ResourceWriter = System.Resources.ResourceWriter; using System.IO; using System.Runtime.Versioning; // This is a package private class. This class hold all of the managed // data member for AssemblyBuilder. Note that what ever data members added to // this class cannot be accessed from the EE. internal class AssemblyBuilderData { [ResourceExposure(ResourceScope.Machine)] [ResourceConsumption(ResourceScope.Machine)] internal AssemblyBuilderData( Assembly assembly, String strAssemblyName, AssemblyBuilderAccess access, String dir) { m_assembly = assembly; m_strAssemblyName = strAssemblyName; m_access = access; m_moduleBuilderList = new ArrayList(); m_resWriterList = new ArrayList(); m_publicComTypeList = null; m_CABuilders = null; m_CABytes = null; m_CACons = null; m_iPublicComTypeCount = 0; m_iCABuilder = 0; m_iCAs = 0; m_entryPointModule = null; m_isSaved = false; if (dir == null && access != AssemblyBuilderAccess.Run) m_strDir = Environment.CurrentDirectory; else m_strDir = dir; m_RequiredPset = null; m_OptionalPset = null; m_RefusedPset = null; m_isSynchronized = true; #if !FEATURE_PAL m_hasUnmanagedVersionInfo = false; m_OverrideUnmanagedVersionInfo = false; #endif // !FEATURE_PAL m_InMemoryAssemblyModule = null; m_OnDiskAssemblyModule = null; m_peFileKind = PEFileKinds.Dll; #if !FEATURE_PAL m_strResourceFileName = null; m_resourceBytes = null; m_nativeVersion = null; #endif m_entryPointMethod = null; m_ISymWrapperAssembly = null; } // Helper to add a dynamic module into the tracking list internal void AddModule(ModuleBuilder dynModule) { m_moduleBuilderList.Add(dynModule); if(m_assembly != null) // also add the Module into the file list in the Assembly. m_assembly.nAddFileToInMemoryFileList(dynModule.m_moduleData.m_strFileName, dynModule); } // Helper to add a resource information into the tracking list internal void AddResWriter(ResWriterData resData) { m_resWriterList.Add(resData); } // Helper to track CAs to persist onto disk internal void AddCustomAttribute(CustomAttributeBuilder customBuilder) { // make sure we have room for this CA if (m_CABuilders == null) { m_CABuilders = new CustomAttributeBuilder[m_iInitialSize]; } if (m_iCABuilder == m_CABuilders.Length) { CustomAttributeBuilder[] tempCABuilders = new CustomAttributeBuilder[m_iCABuilder * 2]; Array.Copy(m_CABuilders, tempCABuilders, m_iCABuilder); m_CABuilders = tempCABuilders; } m_CABuilders[m_iCABuilder] = customBuilder; m_iCABuilder++; } // Helper to track CAs to persist onto disk internal void AddCustomAttribute(ConstructorInfo con, byte[] binaryAttribute) { // make sure we have room for this CA if (m_CABytes == null) { m_CABytes = new byte[m_iInitialSize][]; m_CACons = new ConstructorInfo[m_iInitialSize]; } if (m_iCAs == m_CABytes.Length) { // enlarge the arrays byte[][] temp = new byte[m_iCAs * 2][]; ConstructorInfo[] tempCon = new ConstructorInfo[m_iCAs * 2]; for (int i=0; i < m_iCAs; i++) { temp[i] = m_CABytes[i]; tempCon[i] = m_CACons[i]; } m_CABytes = temp; m_CACons = tempCon; } byte[] attrs = new byte[binaryAttribute.Length]; Array.Copy(binaryAttribute, attrs, binaryAttribute.Length); m_CABytes[m_iCAs] = attrs; m_CACons[m_iCAs] = con; m_iCAs++; } #if !FEATURE_PAL // Helper to calculate unmanaged version info from Assembly's custom attributes. // If DefineUnmanagedVersionInfo is called, the parameter provided will override // the CA's value. // internal void FillUnmanagedVersionInfo() { // Get the lcid set on the assembly name as default if available // Note that if LCID is not avaible from neither AssemblyName or AssemblyCultureAttribute, // it is default to -1 which is treated as language neutral. // CultureInfo locale = m_assembly.GetLocale(); if (locale != null) m_nativeVersion.m_lcid = locale.LCID; for (int i = 0; i < m_iCABuilder; i++) { // Type conType = m_CABuilders[i].m_con.DeclaringType; if (m_CABuilders[i].m_constructorArgs.Length == 0 || m_CABuilders[i].m_constructorArgs[0] == null) continue; if (conType.Equals(typeof(System.Reflection.AssemblyCopyrightAttribute))) { // assertt that we should only have one argument for this CA and the type should // be a string. // if (m_CABuilders[i].m_constructorArgs.Length != 1) { throw new ArgumentException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString( "Argument_BadCAForUnmngRSC"), m_CABuilders[i].m_con.ReflectedType.Name)); } if (m_OverrideUnmanagedVersionInfo == false) { m_nativeVersion.m_strCopyright = m_CABuilders[i].m_constructorArgs[0].ToString(); } } else if (conType.Equals(typeof(System.Reflection.AssemblyTrademarkAttribute))) { // assertt that we should only have one argument for this CA and the type should // be a string. // if (m_CABuilders[i].m_constructorArgs.Length != 1) { throw new ArgumentException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString( "Argument_BadCAForUnmngRSC"), m_CABuilders[i].m_con.ReflectedType.Name)); } if (m_OverrideUnmanagedVersionInfo == false) { m_nativeVersion.m_strTrademark = m_CABuilders[i].m_constructorArgs[0].ToString(); } } else if (conType.Equals(typeof(System.Reflection.AssemblyProductAttribute))) { if (m_OverrideUnmanagedVersionInfo == false) { // assertt that we should only have one argument for this CA and the type should // be a string. // m_nativeVersion.m_strProduct = m_CABuilders[i].m_constructorArgs[0].ToString(); } } else if (conType.Equals(typeof(System.Reflection.AssemblyCompanyAttribute))) { if (m_CABuilders[i].m_constructorArgs.Length != 1) { throw new ArgumentException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString( "Argument_BadCAForUnmngRSC"), m_CABuilders[i].m_con.ReflectedType.Name)); } if (m_OverrideUnmanagedVersionInfo == false) { // assertt that we should only have one argument for this CA and the type should // be a string. // m_nativeVersion.m_strCompany = m_CABuilders[i].m_constructorArgs[0].ToString(); } } else if (conType.Equals(typeof(System.Reflection.AssemblyDescriptionAttribute))) { if (m_CABuilders[i].m_constructorArgs.Length != 1) { throw new ArgumentException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString( "Argument_BadCAForUnmngRSC"), m_CABuilders[i].m_con.ReflectedType.Name)); } m_nativeVersion.m_strDescription = m_CABuilders[i].m_constructorArgs[0].ToString(); } else if (conType.Equals(typeof(System.Reflection.AssemblyTitleAttribute))) { if (m_CABuilders[i].m_constructorArgs.Length != 1) { throw new ArgumentException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString( "Argument_BadCAForUnmngRSC"), m_CABuilders[i].m_con.ReflectedType.Name)); } m_nativeVersion.m_strTitle = m_CABuilders[i].m_constructorArgs[0].ToString(); } else if (conType.Equals(typeof(System.Reflection.AssemblyInformationalVersionAttribute))) { if (m_CABuilders[i].m_constructorArgs.Length != 1) { throw new ArgumentException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString( "Argument_BadCAForUnmngRSC"), m_CABuilders[i].m_con.ReflectedType.Name)); } if (m_OverrideUnmanagedVersionInfo == false) { m_nativeVersion.m_strProductVersion = m_CABuilders[i].m_constructorArgs[0].ToString(); } } else if (conType.Equals(typeof(System.Reflection.AssemblyCultureAttribute))) { // retrieve the LCID if (m_CABuilders[i].m_constructorArgs.Length != 1) { throw new ArgumentException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString( "Argument_BadCAForUnmngRSC"), m_CABuilders[i].m_con.ReflectedType.Name)); } // CultureInfo attribute overrides the lcid from AssemblyName. CultureInfo culture = new CultureInfo(m_CABuilders[i].m_constructorArgs[0].ToString()); m_nativeVersion.m_lcid = culture.LCID; } else if (conType.Equals(typeof(System.Reflection.AssemblyFileVersionAttribute))) { if (m_CABuilders[i].m_constructorArgs.Length != 1) { throw new ArgumentException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString( "Argument_BadCAForUnmngRSC"), m_CABuilders[i].m_con.ReflectedType.Name)); } if (m_OverrideUnmanagedVersionInfo == false) { m_nativeVersion.m_strFileVersion = m_CABuilders[i].m_constructorArgs[0].ToString(); } } } } #endif //!FEATURE_PAL // Helper to ensure the resource name is unique underneath assemblyBuilder internal void CheckResNameConflict(String strNewResName) { int size = m_resWriterList.Count; int i; for (i = 0; i < size; i++) { ResWriterData resWriter = (ResWriterData) m_resWriterList[i]; if (resWriter.m_strName.Equals(strNewResName)) { // Cannot have two resources with the same name throw new ArgumentException(Environment.GetResourceString("Argument_DuplicateResourceName")); } } } // Helper to ensure the module name is unique underneath assemblyBuilder [ResourceExposure(ResourceScope.None)] [ResourceConsumption(ResourceScope.Assembly, ResourceScope.Assembly)] internal void CheckNameConflict(String strNewModuleName) { int size = m_moduleBuilderList.Count; int i; for (i = 0; i < size; i++) { ModuleBuilder moduleBuilder = (ModuleBuilder) m_moduleBuilderList[i]; if (moduleBuilder.m_moduleData.m_strModuleName.Equals(strNewModuleName)) { // Cannot have two dynamic modules with the same name throw new ArgumentException(Environment.GetResourceString("Argument_DuplicateModuleName")); } } // Also if (!(m_assembly is AssemblyBuilder)) { if (m_assembly.GetModule(strNewModuleName) != null) { // Cannot have two dynamic modules with the same name throw new ArgumentException(Environment.GetResourceString("Argument_DuplicateModuleName")); } } } // Helper to ensure the type name is unique underneath assemblyBuilder internal void CheckTypeNameConflict(String strTypeName, TypeBuilder enclosingType) { BCLDebug.Log("DYNIL","## DYNIL LOGGING: AssemblyBuilderData.CheckTypeNameConflict( " + strTypeName + " )"); for (int i = 0; i < m_moduleBuilderList.Count; i++) { ModuleBuilder curModule = (ModuleBuilder)m_moduleBuilderList[i]; for (int j = 0; j < curModule.m_TypeBuilderList.Count; j++) { Type curType = (Type)curModule.m_TypeBuilderList[j]; if (curType.FullName.Equals(strTypeName) && curType.DeclaringType == enclosingType) { // Cannot have two types with the same name throw new ArgumentException(Environment.GetResourceString("Argument_DuplicateTypeName")); } } } // Also if ((enclosingType == null) && !(m_assembly is AssemblyBuilder)) { if (m_assembly.GetType(strTypeName, false, false) != null) { // Cannot have two types with the same name throw new ArgumentException(Environment.GetResourceString("Argument_DuplicateTypeName")); } } } // Helper to ensure the file name is unique underneath assemblyBuilder. This includes // modules and resources. // // // internal void CheckFileNameConflict(String strFileName) { int size = m_moduleBuilderList.Count; int i; for (i = 0; i < size; i++) { ModuleBuilder moduleBuilder = (ModuleBuilder) m_moduleBuilderList[i]; if (moduleBuilder.m_moduleData.m_strFileName != null) { if (String.Compare(moduleBuilder.m_moduleData.m_strFileName, strFileName, StringComparison.OrdinalIgnoreCase) == 0) { // Cannot have two dynamic module with the same name throw new ArgumentException(Environment.GetResourceString("Argument_DuplicatedFileName")); } } } size = m_resWriterList.Count; for (i = 0; i < size; i++) { ResWriterData resWriter = (ResWriterData) m_resWriterList[i]; if (resWriter.m_strFileName != null) { if (String.Compare(resWriter.m_strFileName, strFileName, StringComparison.OrdinalIgnoreCase) == 0) { // Cannot have two dynamic module with the same name throw new ArgumentException(Environment.GetResourceString("Argument_DuplicatedFileName")); } } } } // Helper to look up which module that assembly is supposed to be stored at // // // internal ModuleBuilder FindModuleWithFileName(String strFileName) { int size = m_moduleBuilderList.Count; int i; for (i = 0; i < size; i++) { ModuleBuilder moduleBuilder = (ModuleBuilder) m_moduleBuilderList[i]; if (moduleBuilder.m_moduleData.m_strFileName != null) { if (String.Compare(moduleBuilder.m_moduleData.m_strFileName, strFileName, StringComparison.OrdinalIgnoreCase) == 0) { return moduleBuilder; } } } return null; } // Helper to look up module by name. // // // internal ModuleBuilder FindModuleWithName(String strName) { int size = m_moduleBuilderList.Count; int i; for (i = 0; i < size; i++) { ModuleBuilder moduleBuilder = (ModuleBuilder) m_moduleBuilderList[i]; if (moduleBuilder.m_moduleData.m_strModuleName != null) { if (String.Compare(moduleBuilder.m_moduleData.m_strModuleName, strName, StringComparison.OrdinalIgnoreCase) == 0) return moduleBuilder; } } return null; } // add type to public COMType tracking list internal void AddPublicComType(Type type) { BCLDebug.Log("DYNIL","## DYNIL LOGGING: AssemblyBuilderData.AddPublicComType( " + type.FullName + " )"); if (m_isSaved == true) { // assembly has been saved before! throw new InvalidOperationException(Environment.GetResourceString( "InvalidOperation_CannotAlterAssembly")); } EnsurePublicComTypeCapacity(); m_publicComTypeList[m_iPublicComTypeCount] = type; m_iPublicComTypeCount++; } // add security permission requests internal void AddPermissionRequests( PermissionSet required, PermissionSet optional, PermissionSet refused) { BCLDebug.Log("DYNIL","## DYNIL LOGGING: AssemblyBuilderData.AddPermissionRequests"); if (m_isSaved == true) { // assembly has been saved before! throw new InvalidOperationException(Environment.GetResourceString( "InvalidOperation_CannotAlterAssembly")); } m_RequiredPset = required; m_OptionalPset = optional; m_RefusedPset = refused; } internal void EnsurePublicComTypeCapacity() { if (m_publicComTypeList == null) { m_publicComTypeList = new Type[m_iInitialSize]; } if (m_iPublicComTypeCount == m_publicComTypeList.Length) { Type[] tempTypeList = new Type[m_iPublicComTypeCount * 2]; Array.Copy(m_publicComTypeList, tempTypeList, m_iPublicComTypeCount); m_publicComTypeList = tempTypeList; } } internal ModuleBuilder GetInMemoryAssemblyModule() { if (m_InMemoryAssemblyModule == null) { ModuleBuilder modBuilder = (ModuleBuilder)m_assembly.nGetInMemoryAssemblyModule(); modBuilder.Init("RefEmit_InMemoryManifestModule", null, null); m_InMemoryAssemblyModule = modBuilder; } return m_InMemoryAssemblyModule; } internal ModuleBuilder GetOnDiskAssemblyModule() { if (m_OnDiskAssemblyModule == null) { ModuleBuilder modBuilder = (ModuleBuilder)m_assembly.nGetOnDiskAssemblyModule(); modBuilder.Init("RefEmit_OnDiskManifestModule", null, null); m_OnDiskAssemblyModule = modBuilder; } return m_OnDiskAssemblyModule; } internal void SetOnDiskAssemblyModule(ModuleBuilder modBuilder) { m_OnDiskAssemblyModule = modBuilder; } internal ArrayList m_moduleBuilderList; internal ArrayList m_resWriterList; internal String m_strAssemblyName; internal AssemblyBuilderAccess m_access; internal Assembly m_assembly; internal Type[] m_publicComTypeList; internal int m_iPublicComTypeCount; internal ModuleBuilder m_entryPointModule; internal bool m_isSaved; internal const int m_iInitialSize = 16; internal String m_strDir; // hard coding the assembly def token internal const int m_tkAssembly = 0x20000001; // Security permission requests internal PermissionSet m_RequiredPset; internal PermissionSet m_OptionalPset; internal PermissionSet m_RefusedPset; // Assembly builder may be optionally synchronized. internal bool m_isSynchronized; // tracking AssemblyDef's CAs for persistence to disk internal CustomAttributeBuilder[] m_CABuilders; internal int m_iCABuilder; internal byte[][] m_CABytes; internal ConstructorInfo[] m_CACons; internal int m_iCAs; internal PEFileKinds m_peFileKind; // assembly file kind private ModuleBuilder m_InMemoryAssemblyModule; private ModuleBuilder m_OnDiskAssemblyModule; internal MethodInfo m_entryPointMethod; internal Assembly m_ISymWrapperAssembly; #if !FEATURE_PAL // For unmanaged resources internal String m_strResourceFileName; internal byte[] m_resourceBytes; internal NativeVersionInfo m_nativeVersion; internal bool m_hasUnmanagedVersionInfo; internal bool m_OverrideUnmanagedVersionInfo; #endif // !FEATURE_PAL } /********************************************** * * Internal structure to track the list of ResourceWriter for * AssemblyBuilder & ModuleBuilder. * **********************************************/ internal class ResWriterData { internal ResWriterData( ResourceWriter resWriter, Stream memoryStream, String strName, String strFileName, String strFullFileName, ResourceAttributes attribute) { m_resWriter = resWriter; m_memoryStream = memoryStream; m_strName = strName; m_strFileName = strFileName; m_strFullFileName = strFullFileName; m_nextResWriter = null; m_attribute = attribute; } internal ResourceWriter m_resWriter; internal String m_strName; internal String m_strFileName; internal String m_strFullFileName; internal Stream m_memoryStream; internal ResWriterData m_nextResWriter; internal ResourceAttributes m_attribute; } #if !FEATURE_PAL internal class NativeVersionInfo { internal NativeVersionInfo() { m_strDescription = null; m_strCompany = null; m_strTitle = null; m_strCopyright = null; m_strTrademark = null; m_strProduct = null; m_strProductVersion = null; m_strFileVersion = null; m_lcid = -1; } internal String m_strDescription; internal String m_strCompany; internal String m_strTitle; internal String m_strCopyright; internal String m_strTrademark; internal String m_strProduct; internal String m_strProductVersion; internal String m_strFileVersion; internal int m_lcid; } #endif //!FEATURE_PAL } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ColumnResizeAdorner.cs
- OutputWindow.cs
- DataControlButton.cs
- WebMessageEncodingElement.cs
- OleDbTransaction.cs
- XmlAnyElementAttributes.cs
- DesignBindingValueUIHandler.cs
- XsltSettings.cs
- webeventbuffer.cs
- XmlILStorageConverter.cs
- CalendarTable.cs
- ExtensionDataObject.cs
- DrawingState.cs
- MouseGestureConverter.cs
- NegotiationTokenProvider.cs
- StateRuntime.cs
- SqlDataSourceCache.cs
- ConfigXmlElement.cs
- DataListCommandEventArgs.cs
- SoapServerMessage.cs
- ApplicationSettingsBase.cs
- XmlEventCache.cs
- Bezier.cs
- FixedElement.cs
- ValidationPropertyAttribute.cs
- BindingsCollection.cs
- SimpleBitVector32.cs
- ImageInfo.cs
- PeerReferralPolicy.cs
- DBCommand.cs
- ListParagraph.cs
- ComplusTypeValidator.cs
- diagnosticsswitches.cs
- AlternateViewCollection.cs
- XPathDocumentIterator.cs
- X509CertificateStore.cs
- XmlNamedNodeMap.cs
- ListViewTableRow.cs
- WebProxyScriptElement.cs
- HttpAsyncResult.cs
- ActionItem.cs
- SqlDataSourceFilteringEventArgs.cs
- CharKeyFrameCollection.cs
- WmpBitmapDecoder.cs
- InputMethodStateTypeInfo.cs
- MenuItem.cs
- XmlSignatureManifest.cs
- TrailingSpaceComparer.cs
- ProfileService.cs
- MultiPropertyDescriptorGridEntry.cs
- AppendHelper.cs
- SvcMapFileSerializer.cs
- altserialization.cs
- Mapping.cs
- SubstitutionResponseElement.cs
- MessageAction.cs
- MouseGestureValueSerializer.cs
- SequenceDesigner.cs
- Mappings.cs
- StringResourceManager.cs
- CompilerScope.cs
- AssemblyAttributesGoHere.cs
- DataSourceControlBuilder.cs
- UnSafeCharBuffer.cs
- ConfigXmlSignificantWhitespace.cs
- RowUpdatedEventArgs.cs
- EntityStoreSchemaFilterEntry.cs
- HandlerFactoryWrapper.cs
- AnnotationHighlightLayer.cs
- diagnosticsswitches.cs
- path.cs
- ImageListStreamer.cs
- ResourceIDHelper.cs
- GetCryptoTransformRequest.cs
- NullableDecimalMinMaxAggregationOperator.cs
- MethodRental.cs
- TableAdapterManagerHelper.cs
- ProxyManager.cs
- ObjectCloneHelper.cs
- PageCopyCount.cs
- ArglessEventHandlerProxy.cs
- GroupLabel.cs
- ThaiBuddhistCalendar.cs
- ReservationNotFoundException.cs
- FileReservationCollection.cs
- XhtmlTextWriter.cs
- Int16Animation.cs
- SafeCryptoHandles.cs
- StorageRoot.cs
- UserControlBuildProvider.cs
- HMACMD5.cs
- SourceLocationProvider.cs
- CodeDOMProvider.cs
- OuterGlowBitmapEffect.cs
- TriggerBase.cs
- BindingExpressionBase.cs
- MenuEventArgs.cs
- TaskHelper.cs
- EncoderFallback.cs
- FormViewPagerRow.cs