[源码学习]记录RazorParser Call Stack
SystemWebMvc\Mvc\VirtualPathProviderViewEngine.cs
继承关系 RazorViewEngine : BuildManagerViewEngine : VirtualPathProviderViewEngine
VirtualPathProviderViewEngine类
继承关系 RazorViewEngine : BuildManagerViewEngine : VirtualPathProviderViewEngine
VirtualPathProviderViewEngine类
FindView方法 134行
string viewPath = GetPath(controllerContext, ViewLocationFormats, AreaViewLocationFormats, "ViewLocationFormats", viewName, controllerName, _cacheKeyPrefix_View, useCache, out viewLocationsSearched);
GetPath方法 167行
return (nameRepresentsPath) ?
GetPathFromSpecificName(controllerContext, name, cacheKey, ref searchedLocations) :
GetPathFromGeneralName(controllerContext, viewLocations, name, controllerName, areaName, cacheKey, ref searchedLocations);
GetPathFromSpecificName(controllerContext, name, cacheKey, ref searchedLocations) :
GetPathFromGeneralName(controllerContext, viewLocations, name, controllerName, areaName, cacheKey, ref searchedLocations);
GetPathFromGeneralName方法 180行
if (FileExists(controllerContext, virtualPath))
BuildManagerViewEngine 类
FileExists方法 42行
return BuildManager.FileExists(virtualPath);
BuildManagerWrapper 类
FileExists方法 8行
return BuildManager.GetObjectFactory(virtualPath, false) != null;
********************
只有注册了Rozor的BuildProcider,BuildManager才会调用
System.Web.WebPages.Razor\Properties\AssemblyInfo.cs
13行
[assembly: PreApplicationStartMethod(typeof(PreApplicationStartCode), "Start")]
System.Web.WebPages.Razor\PreApplicationStartCode.cs
26行
BuildProvider.RegisterBuildProvider(".cshtml", typeof(RazorBuildProvider));
BuildProvider.RegisterBuildProvider(".vbhtml", typeof(RazorBuildProvider));
BuildProvider.RegisterBuildProvider(".vbhtml", typeof(RazorBuildProvider));
********************
RazorBuildProvider 类
CodeCompilerType属性 98行
EnsureGeneratedCode();
EnsureGeneratedCode方法 166行
RazorTemplateEngine engine = new RazorTemplateEngine(Host);
GeneratorResults results = null;
using (TextReader reader = InternalOpenReader()) {
results = engine.GenerateCode(reader, className: null, rootNamespace: null, sourceFileName: Host.PhysicalPath);
}
GeneratorResults results = null;
using (TextReader reader = InternalOpenReader()) {
results = engine.GenerateCode(reader, className: null, rootNamespace: null, sourceFileName: Host.PhysicalPath);
}
System.Web.Razor\RazorTemplateEngine.cs
126行
public GeneratorResults GenerateCode(TextReader input, string className, string rootNamespace, string sourceFileName) {
return GenerateCode(input, className, rootNamespace, sourceFileName, null);
}
return GenerateCode(input, className, rootNamespace, sourceFileName, null);
}
130行
[SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope", Justification = "Input object would be disposed if we dispose the wrapper. We don't own the input so we don't want to dispose it")]
public GeneratorResults GenerateCode(TextReader input, string className, string rootNamespace, string sourceFileName, CancellationToken? cancelToken) {
return GenerateCodeCore(new BufferingTextReader(input), className, rootNamespace, sourceFileName, cancelToken);
}
public GeneratorResults GenerateCode(TextReader input, string className, string rootNamespace, string sourceFileName, CancellationToken? cancelToken) {
return GenerateCodeCore(new BufferingTextReader(input), className, rootNamespace, sourceFileName, cancelToken);
}
148行
RazorParser parser = CreateParser();
Debug.Assert(parser != null);
parser.Parse(input, consumer);
Debug.Assert(parser != null);
parser.Parse(input, consumer);
System.Web.Razor\Parser\RazorParser.cs
35行
public virtual void Parse(LookaheadTextReader input, ParserVisitor visitor) {
// Setup the parser context
ParserContext context = new ParserContext(input, CodeParser, MarkupParser, MarkupParser, visitor) {
DesignTimeMode = DesignTimeMode
};
MarkupParser.Context = context;
CodeParser.Context = context;
// Execute the context
try {
MarkupParser.ParseDocument();
}
finally {
context.OnComplete();
}
}
// Setup the parser context
ParserContext context = new ParserContext(input, CodeParser, MarkupParser, MarkupParser, visitor) {
DesignTimeMode = DesignTimeMode
};
MarkupParser.Context = context;
CodeParser.Context = context;
// Execute the context
try {
MarkupParser.ParseDocument();
}
finally {
context.OnComplete();
}
}