Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / whidbey / NetFXspW7 / ndp / fx / src / xsp / System / Web / Compilation / BaseResourcesBuildProvider.cs / 1 / BaseResourcesBuildProvider.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Web.Compilation { using System; using System.Resources; using System.Resources.Tools; using System.Reflection; using System.Globalization; using System.Collections; using System.IO; using System.Xml; using System.Xml.Schema; using System.CodeDom; using System.CodeDom.Compiler; using System.Web.Configuration; using System.Web.Hosting; using System.Web.Compilation; using System.Web.Util; using Util=System.Web.UI.Util; /// Base class for BuildProviders that generate resources [BuildProviderAppliesTo(BuildProviderAppliesTo.Resources)] internal abstract class BaseResourcesBuildProvider : BuildProvider { internal const string DefaultResourcesNamespace = "Resources"; // The generated namespace and type name private string _ns; private string _typeName; private string _cultureName; private bool _dontGenerateStronglyTypedClass; internal void DontGenerateStronglyTypedClass() { _dontGenerateStronglyTypedClass = true; } public override void GenerateCode(AssemblyBuilder assemblyBuilder) { _cultureName = GetCultureName(); if (!_dontGenerateStronglyTypedClass) { // Get the namespace and type name that we will use _ns = Util.GetNamespaceAndTypeNameFromVirtualPath(VirtualPathObject, (_cultureName == null) ? 1 : 2 /*chunksToIgnore*/, out _typeName); // Always prepend the namespace with Resources. if (_ns.Length == 0) _ns = DefaultResourcesNamespace; else _ns = DefaultResourcesNamespace + "." + _ns; } // Get an input stream for our virtual path, and get a resource reader from it using (Stream inputStream = OpenStream()) { IResourceReader reader = GetResourceReader(inputStream); try { GenerateResourceFile(assemblyBuilder, reader); } catch (ArgumentException e) { // If the inner exception is Xml, throw that instead, as it contains more // useful info if (e.InnerException != null && (e.InnerException is XmlException || e.InnerException is XmlSchemaException)) { throw e.InnerException; } // Otherwise, so just rethrow throw; } // Skip the code part for satellite assemblies, or if dontGenerate is set if (_cultureName == null && !_dontGenerateStronglyTypedClass) GenerateStronglyTypedClass(assemblyBuilder, reader); } } protected abstract IResourceReader GetResourceReader(Stream inputStream); private void GenerateResourceFile(AssemblyBuilder assemblyBuilder, IResourceReader reader) { // Get the name of the generated .resource file string resourceFileName; if (_ns == null) { // In the case where we don't generate code, just name the resource file // after the virtual file resourceFileName = UrlPath.GetFileNameWithoutExtension(VirtualPath) + ".resources"; } else if (_cultureName == null) { // Name the resource file after the generated class, since that's what the // generated class expects resourceFileName = _ns + "." + _typeName + ".resources"; } else { // If it's a non-default resource, include the culture in the name resourceFileName = _ns + "." + _typeName + "." + _cultureName + ".resources"; } // Make it lower case, since GetManifestResourceStream (which we use later on) is // case sensitive resourceFileName = resourceFileName.ToLower(CultureInfo.InvariantCulture); Stream outputStream; try { outputStream = assemblyBuilder.CreateEmbeddedResource(this, resourceFileName); } catch (ArgumentException) { // This throws an ArgumentException if the resource file name was already added. // Catch the situation, and give a better error message (VSWhidbey 87110) throw new HttpException(SR.GetString( SR.Duplicate_Resource_File, VirtualPath)); } // Create an output stream from the .resource file using (outputStream) { using (IResourceWriter writer = new ResourceWriter(outputStream)) { // Copy the resources foreach(DictionaryEntry de in reader) { writer.AddResource((string)de.Key, de.Value); } } } } private void GenerateStronglyTypedClass(AssemblyBuilder assemblyBuilder, IResourceReader reader) { // Copy the resources into an IDictionary IDictionary resourceList; using (reader) { resourceList = GetResourceList(reader); } // Generate a strongly typed class from the resources CodeDomProvider provider = assemblyBuilder.CodeDomProvider; string[] unmatchable; CodeCompileUnit ccu = StronglyTypedResourceBuilder.Create( resourceList, _typeName, _ns, provider, false /*internalClass*/, out unmatchable); // Ignore the unmatchable items. We just won't generate code for them, // but they'll still be usable via the ResourceManager (VSWhidbey 248226) // We decided to cut support for My.Resources (VSWhidbey 358088) #if OLD // generate a My.Resources.* override (VSWhidbey 251554) CodeNamespace ns = new CodeNamespace(); ns.Name = "My." + _ns; CodeTypeDeclaration type = new CodeTypeDeclaration(); type.Name = _typeName; CodeTypeReference baseType = new CodeTypeReference(_ns + "." + _typeName); // Need to use a global reference to avoid a conflict, since the classes have the same name baseType.Options = CodeTypeReferenceOptions.GlobalReference; type.BaseTypes.Add(baseType); ns.Types.Add(type); ccu.Namespaces.Add(ns); #endif // Add the code compile unit to the compilation assemblyBuilder.AddCodeCompileUnit(this, ccu); } private IDictionary GetResourceList(IResourceReader reader) { // Read the resources into a dictionary. IDictionary resourceList = new Hashtable(StringComparer.OrdinalIgnoreCase); foreach(DictionaryEntry de in reader) resourceList.Add(de.Key, de.Value); return resourceList; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Web.Compilation { using System; using System.Resources; using System.Resources.Tools; using System.Reflection; using System.Globalization; using System.Collections; using System.IO; using System.Xml; using System.Xml.Schema; using System.CodeDom; using System.CodeDom.Compiler; using System.Web.Configuration; using System.Web.Hosting; using System.Web.Compilation; using System.Web.Util; using Util=System.Web.UI.Util; /// Base class for BuildProviders that generate resources [BuildProviderAppliesTo(BuildProviderAppliesTo.Resources)] internal abstract class BaseResourcesBuildProvider : BuildProvider { internal const string DefaultResourcesNamespace = "Resources"; // The generated namespace and type name private string _ns; private string _typeName; private string _cultureName; private bool _dontGenerateStronglyTypedClass; internal void DontGenerateStronglyTypedClass() { _dontGenerateStronglyTypedClass = true; } public override void GenerateCode(AssemblyBuilder assemblyBuilder) { _cultureName = GetCultureName(); if (!_dontGenerateStronglyTypedClass) { // Get the namespace and type name that we will use _ns = Util.GetNamespaceAndTypeNameFromVirtualPath(VirtualPathObject, (_cultureName == null) ? 1 : 2 /*chunksToIgnore*/, out _typeName); // Always prepend the namespace with Resources. if (_ns.Length == 0) _ns = DefaultResourcesNamespace; else _ns = DefaultResourcesNamespace + "." + _ns; } // Get an input stream for our virtual path, and get a resource reader from it using (Stream inputStream = OpenStream()) { IResourceReader reader = GetResourceReader(inputStream); try { GenerateResourceFile(assemblyBuilder, reader); } catch (ArgumentException e) { // If the inner exception is Xml, throw that instead, as it contains more // useful info if (e.InnerException != null && (e.InnerException is XmlException || e.InnerException is XmlSchemaException)) { throw e.InnerException; } // Otherwise, so just rethrow throw; } // Skip the code part for satellite assemblies, or if dontGenerate is set if (_cultureName == null && !_dontGenerateStronglyTypedClass) GenerateStronglyTypedClass(assemblyBuilder, reader); } } protected abstract IResourceReader GetResourceReader(Stream inputStream); private void GenerateResourceFile(AssemblyBuilder assemblyBuilder, IResourceReader reader) { // Get the name of the generated .resource file string resourceFileName; if (_ns == null) { // In the case where we don't generate code, just name the resource file // after the virtual file resourceFileName = UrlPath.GetFileNameWithoutExtension(VirtualPath) + ".resources"; } else if (_cultureName == null) { // Name the resource file after the generated class, since that's what the // generated class expects resourceFileName = _ns + "." + _typeName + ".resources"; } else { // If it's a non-default resource, include the culture in the name resourceFileName = _ns + "." + _typeName + "." + _cultureName + ".resources"; } // Make it lower case, since GetManifestResourceStream (which we use later on) is // case sensitive resourceFileName = resourceFileName.ToLower(CultureInfo.InvariantCulture); Stream outputStream; try { outputStream = assemblyBuilder.CreateEmbeddedResource(this, resourceFileName); } catch (ArgumentException) { // This throws an ArgumentException if the resource file name was already added. // Catch the situation, and give a better error message (VSWhidbey 87110) throw new HttpException(SR.GetString( SR.Duplicate_Resource_File, VirtualPath)); } // Create an output stream from the .resource file using (outputStream) { using (IResourceWriter writer = new ResourceWriter(outputStream)) { // Copy the resources foreach(DictionaryEntry de in reader) { writer.AddResource((string)de.Key, de.Value); } } } } private void GenerateStronglyTypedClass(AssemblyBuilder assemblyBuilder, IResourceReader reader) { // Copy the resources into an IDictionary IDictionary resourceList; using (reader) { resourceList = GetResourceList(reader); } // Generate a strongly typed class from the resources CodeDomProvider provider = assemblyBuilder.CodeDomProvider; string[] unmatchable; CodeCompileUnit ccu = StronglyTypedResourceBuilder.Create( resourceList, _typeName, _ns, provider, false /*internalClass*/, out unmatchable); // Ignore the unmatchable items. We just won't generate code for them, // but they'll still be usable via the ResourceManager (VSWhidbey 248226) // We decided to cut support for My.Resources (VSWhidbey 358088) #if OLD // generate a My.Resources.* override (VSWhidbey 251554) CodeNamespace ns = new CodeNamespace(); ns.Name = "My." + _ns; CodeTypeDeclaration type = new CodeTypeDeclaration(); type.Name = _typeName; CodeTypeReference baseType = new CodeTypeReference(_ns + "." + _typeName); // Need to use a global reference to avoid a conflict, since the classes have the same name baseType.Options = CodeTypeReferenceOptions.GlobalReference; type.BaseTypes.Add(baseType); ns.Types.Add(type); ccu.Namespaces.Add(ns); #endif // Add the code compile unit to the compilation assemblyBuilder.AddCodeCompileUnit(this, ccu); } private IDictionary GetResourceList(IResourceReader reader) { // Read the resources into a dictionary. IDictionary resourceList = new Hashtable(StringComparer.OrdinalIgnoreCase); foreach(DictionaryEntry de in reader) resourceList.Add(de.Key, de.Value); return resourceList; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- EntityDataSourceEntitySetNameItem.cs
- ConsumerConnectionPointCollection.cs
- DetailsViewInsertedEventArgs.cs
- StartFileNameEditor.cs
- AssemblyCache.cs
- BamlLocalizationDictionary.cs
- MissingSatelliteAssemblyException.cs
- SchemaImporterExtensionElement.cs
- TreeViewHitTestInfo.cs
- MediaScriptCommandRoutedEventArgs.cs
- Visitors.cs
- DeploymentSection.cs
- ProtectedProviderSettings.cs
- QueryResponse.cs
- ActionItem.cs
- TraceXPathNavigator.cs
- ToolStripContentPanel.cs
- _SslStream.cs
- Int64AnimationUsingKeyFrames.cs
- ProxyGenerationError.cs
- IgnoreFlushAndCloseStream.cs
- SiteMapNodeCollection.cs
- PrivacyNoticeBindingElementImporter.cs
- TableLayoutSettings.cs
- SmtpNtlmAuthenticationModule.cs
- LineVisual.cs
- PrimitiveSchema.cs
- NumberSubstitution.cs
- Random.cs
- EventLogRecord.cs
- HttpTransportManager.cs
- NoResizeHandleGlyph.cs
- DataChangedEventManager.cs
- SmiSettersStream.cs
- GridView.cs
- ExpressionPrefixAttribute.cs
- CompilerTypeWithParams.cs
- XPathDocumentIterator.cs
- HttpCachePolicy.cs
- ThreadSafeMessageFilterTable.cs
- Convert.cs
- CompilationSection.cs
- PenContexts.cs
- TextViewBase.cs
- AddInControllerImpl.cs
- ReflectionUtil.cs
- ISCIIEncoding.cs
- RuntimeConfigurationRecord.cs
- CheckBox.cs
- GacUtil.cs
- TextRangeEditLists.cs
- SystemColors.cs
- Parallel.cs
- JoinGraph.cs
- EntityDataSourceReferenceGroup.cs
- BuildResult.cs
- WebPartEditVerb.cs
- WindowsTooltip.cs
- DictionarySectionHandler.cs
- GeometryModel3D.cs
- BezierSegment.cs
- InputProcessorProfiles.cs
- HtmlTextArea.cs
- WebProxyScriptElement.cs
- BitmapDecoder.cs
- TextTreeInsertUndoUnit.cs
- FormClosingEvent.cs
- TextSelectionHighlightLayer.cs
- AnnotationAdorner.cs
- TextHidden.cs
- UIElementParaClient.cs
- SkewTransform.cs
- InternalUserCancelledException.cs
- OneOfScalarConst.cs
- SettingsSection.cs
- XmlSchemaElement.cs
- XPathBinder.cs
- CustomCategoryAttribute.cs
- ObjectManager.cs
- BitmapEditor.cs
- SharedStatics.cs
- DataGridViewComboBoxColumn.cs
- GridViewColumnCollectionChangedEventArgs.cs
- CellCreator.cs
- CodeMethodInvokeExpression.cs
- TcpStreams.cs
- AdornerPresentationContext.cs
- TdsParserSafeHandles.cs
- FixedSOMTextRun.cs
- DataError.cs
- CategoryEditor.cs
- BitmapEffectGroup.cs
- HighlightVisual.cs
- ReaderWriterLockWrapper.cs
- ApplicationSecurityManager.cs
- CodeArrayIndexerExpression.cs
- DetailsViewCommandEventArgs.cs
- TableAutomationPeer.cs
- TableRowGroup.cs
- CompilerErrorCollection.cs