Code:
/ FX-1434 / FX-1434 / 1.0 / untmp / whidbey / REDBITS / ndp / fx / src / xsp / System / Web / Compilation / BuildProvider.cs / 3 / BuildProvider.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- /********************************* Class hierarchy BuildProvider ProfileBuildProvider BaseResourcesBuildProvider ResXBuildProvider ResourcesBuildProvider XsdBuildProvider WsdlBuildProvider InternalBuildProvider SourceFileBuildProvider SimpleHandlerBuildProvider WebServiceBuildProvider WebHandlerBuildProvider ImageGeneratorBuildProvider BaseTemplateBuildProvider ApplicationBuildProvider TemplateControlBuildProvider PageBuildProvider UserControlBuildProvider MasterPageBuildProvider PageThemeBuildProvider GlobalPageThemeBuildProvider **********************************/ namespace System.Web.Compilation { using System; using System.Security.Permissions; using System.IO; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using System.CodeDom; using System.CodeDom.Compiler; using System.Web.Util; using System.Web.UI; using System.Web.Hosting; // Flags returned from BuildProvider.GetResultFlags [Flags] public enum BuildProviderResultFlags { Default = 0, ShutdownAppDomainOnChange = 1, } ////// [AspNetHostingPermission(SecurityAction.LinkDemand, Level=AspNetHostingPermissionLevel.High)] [AspNetHostingPermission(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.High)] public abstract class BuildProvider { // // Public interface // ////// Base class for build providers that want to participate in a compilation. /// It should be used by build providers that process files based on a virtual path. /// ////// Returns the CompilerType for the language that this build provider /// needs to use, or null of it can use any language. /// public virtual CompilerType CodeCompilerType { get { return null; } } ////// Asks this build provider to generate any code that it needs, using the various /// methods on the passed in BuildProvider. /// public virtual void GenerateCode(AssemblyBuilder assemblyBuilder) {} ////// Returns the class generated by this buildprovider /// public virtual Type GetGeneratedType(CompilerResults results) { return null; } ////// Returns a string that the provider wants to have persisted with the compiled assembly. /// public virtual string GetCustomString(CompilerResults results) { return null; } ////// Returns some flags that drives the behavior of the persisted result. /// public virtual BuildProviderResultFlags GetResultFlags(CompilerResults results) { return BuildProviderResultFlags.Default; } ////// Returns the list of files (virtual paths) that this provider depends on. /// Those files need to be built before this BuildProvider. The resulting assemblies /// are added as references when compiling this BuildProvider. /// This does not include things like server side includes, which don't directly /// produce a BuildResult. /// This is used to implement batching by separating BuildProviders /// internal virtual ICollection GetBuildResultVirtualPathDependencies() { return null; } public virtual ICollection VirtualPathDependencies { get { // By default, return the virtual path as its only dependency return new SingleObjectCollection(VirtualPath); } } ////// Returns the virtual path that this build provider handles /// protected internal string VirtualPath { get { return System.Web.VirtualPath.GetVirtualPathString(_virtualPath); } } ////// Returns the virtual path object that this build provider handles /// internal VirtualPath VirtualPathObject { get { return _virtualPath; } } ////// Opens a stream for the virtual file handled by this provider /// protected Stream OpenStream() { return OpenStream(VirtualPath); } ////// Opens a stream for a virtual file /// protected Stream OpenStream(string virtualPath) { return VirtualPathProvider.OpenFile(virtualPath); } internal /*protected*/ Stream OpenStream(VirtualPath virtualPath) { return virtualPath.OpenFile(); } ////// Opens a reader for the virtual file handled by this provider /// protected TextReader OpenReader() { return OpenReader(VirtualPathObject); } ////// Opens a reader for a virtual file /// protected TextReader OpenReader(string virtualPath) { return OpenReader(System.Web.VirtualPath.Create(virtualPath)); } internal /*protected*/ TextReader OpenReader(VirtualPath virtualPath) { Stream stream = OpenStream(virtualPath); return Util.ReaderFromStream(stream, virtualPath); } ////// Returns a collection of assemblies that the build provider will be compiled with. /// protected ICollection ReferencedAssemblies { get { return _referencedAssemblies; } } ////// Returns the default CompilerType to be used for a specific language /// protected CompilerType GetDefaultCompilerTypeForLanguage(string language) { return CompilationUtil.GetCompilerInfoFromLanguage(VirtualPathObject, language); } ////// Returns the default CompilerType to be used for the default language /// protected CompilerType GetDefaultCompilerType() { return CompilationUtil.GetDefaultLanguageCompilerInfo(null /*compConfig*/, VirtualPathObject); } // // Internal code // #pragma warning disable 0649 internal SimpleBitVector32 flags; #pragma warning restore 0649 // const masks into the BitVector32 internal const int isDependedOn = 0x00000001; internal const int noBuildResult = 0x00000002; internal const int ignoreParseErrors = 0x00000004; internal const int ignoreControlProperties = 0x00000008; internal const int dontThrowOnFirstParseError = 0x00000010; internal const int contributedCode = 0x00000020; private VirtualPath _virtualPath; private ICollection _referencedAssemblies; private BuildProviderSet _buildProviderDependencies; internal BuildProviderSet BuildProviderDependencies { get { return _buildProviderDependencies; } } // Is any other BuildProvider depending on this BuildProvider internal bool IsDependedOn { get { return flags[isDependedOn]; } } internal void SetNoBuildResult() { flags[noBuildResult] = true; } // Remember that this BuildProvider has contributed to the compilation internal void SetContributedCode() { flags[contributedCode] = true; } internal void SetVirtualPath(VirtualPath virtualPath) { _virtualPath = virtualPath; } internal void SetReferencedAssemblies(ICollection referencedAssemblies) { _referencedAssemblies = referencedAssemblies; } internal void AddBuildProviderDependency(BuildProvider dependentBuildProvider) { if (_buildProviderDependencies == null) _buildProviderDependencies = new BuildProviderSet(); _buildProviderDependencies.Add(dependentBuildProvider); dependentBuildProvider.flags[isDependedOn] = true; } /* * Return the culture name for this provider (e.g. "fr" or "fr-fr"). * If no culture applies, return null. */ internal string GetCultureName() { return Util.GetCultureName(VirtualPath); } internal BuildResult GetBuildResult(CompilerResults results) { BuildResult result = CreateBuildResult(results); if (result == null) return null; result.VirtualPath = VirtualPathObject; SetBuildResultDependencies(result); return result; } internal virtual BuildResult CreateBuildResult(CompilerResults results) { // If the build provider is not supposed to have a build result, just return if (flags[noBuildResult]) return null; // Ask the build provider if it wants to persist a Type Type type = GetGeneratedType(results); BuildResult result; if (type != null) { // Create a BuildResult for it BuildResultCompiledType resultCompiledType = CreateBuildResult(type); // If the returned type doesn't come from the generated assembly, set a flag if (results == null || type.Assembly != results.CompiledAssembly) resultCompiledType.UsesExistingAssembly = true; result = resultCompiledType; } else { // Ask the build provider if it instead wants to persist a custom string string customString = GetCustomString(results); // If it does, persist it if (customString != null) { // Only preserve an assembly if the BuildProvider has actually contributed code // to the compilation. result = new BuildResultCustomString( flags[contributedCode] ? results.CompiledAssembly : null, customString); } else { // Nothing was built: nothing to persist if (results == null) return null; // Otherwise, just persist the assembly, if any result = new BuildResultCompiledAssembly(results.CompiledAssembly); } } // Ask the provider it it wants to set some flags on the result int resultFlags = (int) GetResultFlags(results); if (resultFlags != 0) { // Make sure only the lower bits are set Debug.Assert((resultFlags & 0xFFFF0000) == 0); resultFlags &= 0x0000FFFF; result.Flags |= resultFlags; } return result; } internal virtual BuildResultCompiledType CreateBuildResult(Type t) { return new BuildResultCompiledType(t); } internal void SetBuildResultDependencies(BuildResult result) { result.AddVirtualPathDependencies(VirtualPathDependencies); } // // Helper methods // internal static CompilerType GetCompilerTypeFromBuildProvider( BuildProvider buildProvider) { HttpContext context = null; if (EtwTrace.IsTraceEnabled(EtwTraceLevel.Verbose, EtwTraceFlags.Infrastructure) && (context = HttpContext.Current) != null) EtwTrace.Trace(EtwTraceType.ETW_TYPE_PARSE_ENTER, context.WorkerRequest); try { CompilerType compilerType = buildProvider.CodeCompilerType; if (compilerType != null) { CompilationUtil.CheckCompilerOptionsAllowed(compilerType.CompilerParameters.CompilerOptions, false /*config*/, null, 0); } return compilerType; } finally { if (EtwTrace.IsTraceEnabled(EtwTraceLevel.Verbose, EtwTraceFlags.Infrastructure) && context != null) EtwTrace.Trace(EtwTraceType.ETW_TYPE_PARSE_LEAVE, context.WorkerRequest); } } // // Return a 'friendly' string that identifies the build provider // internal static string GetDisplayName(BuildProvider buildProvider) { // If it has a VirtualPath, use it if (buildProvider.VirtualPath != null) { return buildProvider.VirtualPath; } // Otherwise, the best we can do is the type name return buildProvider.GetType().Name; } internal virtual ICollection GetGeneratedTypeNames() { return null; } #region Methods from InternalBuildProvider // Protected internal methods: IgnoreParseErrors and GetCodeCompileUnit // When this is set, we ignore parse errors and keep on processing the page as // well as possible. This is used for the Venus CBM scenario internal virtual bool IgnoreParseErrors { get { return flags[ignoreParseErrors]; } set { flags[ignoreParseErrors] = value; } } // This is used in CBM to instruct the control builders to skip control properties internal bool IgnoreControlProperties { get { return flags[ignoreControlProperties]; } set { flags[ignoreControlProperties] = value; } } // Indicates whether the parser should continue processing for more errors. // This is used in both CBM and aspnet_compiler tool. internal bool ThrowOnFirstParseError { get { return !flags[dontThrowOnFirstParseError]; } set { flags[dontThrowOnFirstParseError] = !value; } } // This is used in the CBM scenario only internal virtual IAssemblyDependencyParser AssemblyDependencyParser { get { return null; } } // This is used in the CBM scenario only ////// Returns the CodeCompileUnit and sets the associated dictionary containing the line pragmas. /// protected internal virtual CodeCompileUnit GetCodeCompileUnit(out IDictionary linePragmasTable) { // Default implementation with code at line 1 string sourceString = Util.StringFromVirtualPath(VirtualPathObject); CodeSnippetCompileUnit snippetCompileUnit = new CodeSnippetCompileUnit(sourceString); LinePragmaCodeInfo codeInfo = new LinePragmaCodeInfo(1 /* startLine */, 1 /* startColumn */, 1 /* startGeneratedColumn */, -1 /* codeLength */, false /* isCodeNuggest */); linePragmasTable = new Hashtable(); linePragmasTable[1] = codeInfo; return snippetCompileUnit; } internal virtual ICollection GetCompileWithDependencies() { return null; } #endregion Methods from InternalBuildProvider } // The InternalBuildProvider class is still retained to internally distinguish between // buildProviders that actually implement the required methods and those that don't, and // also to minimize code change where possible. internal abstract class InternalBuildProvider: BuildProvider { } }
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- HotSpotCollection.cs
- XslUrlEditor.cs
- NoneExcludedImageIndexConverter.cs
- DataGridView.cs
- DataComponentNameHandler.cs
- CodeGroup.cs
- XmlUTF8TextReader.cs
- HandoffBehavior.cs
- GlyphTypeface.cs
- Point3DAnimationBase.cs
- CharacterHit.cs
- ProviderConnectionPoint.cs
- DetailsViewRow.cs
- InputReferenceExpression.cs
- AppSettingsReader.cs
- CodeThrowExceptionStatement.cs
- DoubleConverter.cs
- ExcludePathInfo.cs
- Canvas.cs
- HitTestParameters.cs
- List.cs
- TableHeaderCell.cs
- TypeDescriptionProviderAttribute.cs
- InstalledFontCollection.cs
- VariableModifiersHelper.cs
- FileDialogPermission.cs
- sqlpipe.cs
- WebBaseEventKeyComparer.cs
- FormParameter.cs
- RegexFCD.cs
- IndicCharClassifier.cs
- ServiceDescription.cs
- HiddenFieldDesigner.cs
- EndpointIdentityExtension.cs
- SharedStatics.cs
- WindowsRichEditRange.cs
- HostSecurityManager.cs
- InkPresenterAutomationPeer.cs
- PtsPage.cs
- PasswordPropertyTextAttribute.cs
- XmlBinaryWriter.cs
- GridViewSelectEventArgs.cs
- ViewStateException.cs
- XomlCompilerError.cs
- HandleCollector.cs
- BorderSidesEditor.cs
- RepeatButtonAutomationPeer.cs
- ResourceKey.cs
- ThreadStartException.cs
- CompModSwitches.cs
- DependencyPropertyKey.cs
- ProcessThread.cs
- XmlSchemaDocumentation.cs
- SimpleWorkerRequest.cs
- SafePointer.cs
- SqlTriggerAttribute.cs
- ByteKeyFrameCollection.cs
- RequestSecurityTokenResponseCollection.cs
- EntityContainer.cs
- FileSystemEventArgs.cs
- XmlWrappingReader.cs
- Helper.cs
- EncodingConverter.cs
- Vector3DCollectionConverter.cs
- CloseCryptoHandleRequest.cs
- WebPartConnectionsCancelVerb.cs
- ToolboxDataAttribute.cs
- DatagridviewDisplayedBandsData.cs
- StubHelpers.cs
- WebPartConnectionCollection.cs
- ToggleButton.cs
- DateTimeConverter2.cs
- ProxySimple.cs
- IPEndPoint.cs
- PseudoWebRequest.cs
- ThrowHelper.cs
- LinqDataSourceSelectEventArgs.cs
- ActiveXSerializer.cs
- IriParsingElement.cs
- EndPoint.cs
- HttpCachePolicy.cs
- ObjectDataSourceMethodEventArgs.cs
- PKCS1MaskGenerationMethod.cs
- RestClientProxyHandler.cs
- ByteRangeDownloader.cs
- Msec.cs
- XmlDesigner.cs
- OleDbParameter.cs
- DataControlField.cs
- SqlRemoveConstantOrderBy.cs
- Overlapped.cs
- EditingScopeUndoUnit.cs
- DiscardableAttribute.cs
- TemplateKey.cs
- ProxySimple.cs
- CodeDomSerializerBase.cs
- XmlDocumentFragment.cs
- WorkerRequest.cs
- XmlUTF8TextWriter.cs
- XmlDocumentType.cs