internal static Type GetBrowserCapabilitiesType() { InternalSecurityPermissions.Unrestricted.Assert(); BuildResult buildResultFromCache = null; try { buildResultFromCache = BuildManager.GetBuildResultFromCache("__browserCapabilitiesCompiler"); if (buildResultFromCache == null) { DateTime utcNow = DateTime.UtcNow; VirtualDirectory directory = AppBrowsersVirtualDir.GetDirectory(); string path = HostingEnvironment.MapPathInternal(AppBrowsersVirtualDir); if ((directory != null) && Directory.Exists(path)) { ArrayList list = new ArrayList(); ArrayList list2 = new ArrayList(); if (AddBrowserFilesToList(directory, list, false)) { AddBrowserFilesToList(directory, list2, true); } else { list2 = list; } if (list2.Count > 0) { ApplicationBrowserCapabilitiesBuildProvider o = new ApplicationBrowserCapabilitiesBuildProvider(); foreach (string str2 in list) { o.AddFile(str2); } BuildProvidersCompiler compiler = new BuildProvidersCompiler(null, BuildManager.GenerateRandomAssemblyName("App_Browsers")); compiler.SetBuildProviders(new SingleObjectCollection(o)); buildResultFromCache = new BuildResultCompiledType(compiler.PerformBuild().CompiledAssembly.GetType("ASP.ApplicationBrowserCapabilitiesFactory")) { VirtualPath = AppBrowsersVirtualDir }; buildResultFromCache.AddVirtualPathDependencies(list2); BuildManager.CacheBuildResult("__browserCapabilitiesCompiler", buildResultFromCache, utcNow); } } } } finally { CodeAccessPermission.RevertAssert(); } if (buildResultFromCache == null) { return(_browserCapabilitiesFactoryBaseType); } return(((BuildResultCompiledType)buildResultFromCache).ResultType); }
private void PrecompileAppInternal(VirtualPath startingVirtualDir, IEnumerable<string> excludedVirtualPaths) { // If the app is already precompiled, fail FailIfPrecompiledApp(); excludedVirtualPaths = excludedVirtualPaths ?? Enumerable.Empty<string>(); _excludedCompilationPaths = excludedVirtualPaths.Select(path => VirtualPath.Create(UrlPath.Combine("~", path))).ToList(); VirtualDirectory appVdir = startingVirtualDir.GetDirectory(); EnsureTopLevelFilesCompiled(); try { // Clear the parseError flag first _parseErrorReported = false; PrecompileWebDirectoriesRecursive(appVdir, topLevel: true); PrecompileThemeDirectories(); } catch (HttpParseException parseException) { // if nothing calls callback.reportparseerror yet, report the parse error. if (!_parseErrorReported) { ReportErrorsFromException(parseException); } throw; } // Copy all the DLL's we compiled into the destination's bin directory (if any) if (_precompTargetPhysicalDir != null) { string targetBinDir = Path.Combine(_precompTargetPhysicalDir, HttpRuntime.BinDirectoryName); CopyCompiledAssembliesToDestinationBin(HttpRuntime.CodegenDirInternal, targetBinDir); } // Copy all the static files to the destination directory (if any). We treat anything we // don't compile as a static file. It's better to do this at the end of the precompilation, // this way if any pages has errors (parse or compile), we never get to this step. if (_precompTargetPhysicalDir != null) { CopyStaticFilesRecursive(appVdir, _precompTargetPhysicalDir, topLevel: true); } }
private static BuildResultCompiledType GetThemeBuildResultType(string themeName) { string appThemeCacheKey, globalThemeCacheKey = null; // First, check if the application theme is cached appThemeCacheKey = "Theme_" + Util.MakeValidTypeNameFromString(themeName); BuildResultCompiledType result = (BuildResultCompiledType) BuildManager.GetBuildResultFromCache(appThemeCacheKey); if (result == null) { // Then, check if the global theme is cached globalThemeCacheKey = "GlobalTheme_" + themeName; result = (BuildResultCompiledType)BuildManager.GetBuildResultFromCache( globalThemeCacheKey); } // If we found a theme buildresulttype, return it if (result != null) { return(result); } bool gotLock = false; try { // Grab the compilation mutex CompilationLock.GetLock(ref gotLock); // Check the cache again now that we have the mutex result = (BuildResultCompiledType)BuildManager.GetBuildResultFromCache(appThemeCacheKey); if (result == null) { result = (BuildResultCompiledType)BuildManager.GetBuildResultFromCache( globalThemeCacheKey); } if (result != null) { return(result); } // Theme was not found in the caches; check if the directory exists. VirtualPath appVirtualDir, globalVirtualDir = null; appVirtualDir = GetAppThemeVirtualDir(themeName); PageThemeBuildProvider themeBuildProvider = null; VirtualPath virtualDir = appVirtualDir; string cacheKey = appThemeCacheKey; // If the theme directories do not exist, simply throw if (appVirtualDir.DirectoryExists()) { themeBuildProvider = new PageThemeBuildProvider(appVirtualDir); } else { globalVirtualDir = GetGlobalThemeVirtualDir(themeName); if (!globalVirtualDir.DirectoryExists()) { throw new HttpException(SR.GetString(SR.Page_theme_not_found, themeName)); } virtualDir = globalVirtualDir; cacheKey = globalThemeCacheKey; themeBuildProvider = new GlobalPageThemeBuildProvider(globalVirtualDir); } // The directory exists (either app or global), so compile it DateTime utcStart = DateTime.UtcNow; VirtualDirectory vdir = virtualDir.GetDirectory(); // Add all the .skin files to it AddThemeFilesToBuildProvider(vdir, themeBuildProvider, true); // Use predictable fixed names for theme assemblies. BuildProvidersCompiler bpc = new BuildProvidersCompiler(virtualDir, themeBuildProvider.AssemblyNamePrefix + BuildManager.GenerateRandomAssemblyName(themeName)); // Add the single build provider to the BuildProvidersCompiler bpc.SetBuildProviders(new SingleObjectCollection(themeBuildProvider)); // Compile it CompilerResults results = bpc.PerformBuild(); // Get the Type we care about from the BuildProvider result = (BuildResultCompiledType)themeBuildProvider.GetBuildResult(results); // Cache it for next time BuildManager.CacheBuildResult(cacheKey, result, utcStart); } finally { // Always release the mutex if we had taken it if (gotLock) { CompilationLock.ReleaseLock(); } } return(result); }
internal static Type GetBrowserCapabilitiesType() { //Need to assert here to check directories and files InternalSecurityPermissions.Unrestricted.Assert(); BuildResult result = null; try { // Try the cache first, and if it's not there, compile it result = BuildManager.GetBuildResultFromCache(browerCapabilitiesCacheKey); if (result == null) { DateTime utcStart = DateTime.UtcNow; VirtualDirectory directory = AppBrowsersVirtualDir.GetDirectory(); // first try if app browser dir exists string physicalDir = HostingEnvironment.MapPathInternal(AppBrowsersVirtualDir); /* DevDivBugs 173531 * For the App_Browsers scenario, we need to cache the generated browser caps processing * code. We need to add path dependency on all files so that changes to them will * invalidate the cache entry and cause recompilation. */ if (directory != null && Directory.Exists(physicalDir)) { ArrayList browserFileList = new ArrayList(); ArrayList browserFileDependenciesList = new ArrayList(); bool hasCustomCaps = AddBrowserFilesToList(directory, browserFileList, false); if (hasCustomCaps) { AddBrowserFilesToList(directory, browserFileDependenciesList, true); } else { browserFileDependenciesList = browserFileList; } if (browserFileDependenciesList.Count > 0) { ApplicationBrowserCapabilitiesBuildProvider buildProvider = new ApplicationBrowserCapabilitiesBuildProvider(); foreach (string virtualPath in browserFileList) { buildProvider.AddFile(virtualPath); } BuildProvidersCompiler bpc = new BuildProvidersCompiler(null /*configPath*/, BuildManager.GenerateRandomAssemblyName(BuildManager.AppBrowserCapAssemblyNamePrefix)); bpc.SetBuildProviders(new SingleObjectCollection(buildProvider)); CompilerResults results = bpc.PerformBuild(); Assembly assembly = results.CompiledAssembly; // Get the type we want from the assembly Type t = assembly.GetType( BaseCodeDomTreeGenerator.defaultNamespace + "." + ApplicationBrowserCapabilitiesCodeGenerator.FactoryTypeName); // Cache it for next time result = new BuildResultCompiledType(t); result.VirtualPath = AppBrowsersVirtualDir; result.AddVirtualPathDependencies(browserFileDependenciesList); BuildManager.CacheBuildResult(browerCapabilitiesCacheKey, result, utcStart); } } } } finally { CodeAccessPermission.RevertAssert(); } // Simply return the global factory type. if (result == null) { return(_browserCapabilitiesFactoryBaseType); } // Return the compiled type return(((BuildResultCompiledType)result).ResultType); }
private static BuildResultCompiledType GetThemeBuildResultType(string themeName) { string cacheKey = null; string str = "Theme_" + Util.MakeValidTypeNameFromString(themeName); BuildResultCompiledType buildResultFromCache = (BuildResultCompiledType)BuildManager.GetBuildResultFromCache(str); if (buildResultFromCache == null) { cacheKey = "GlobalTheme_" + themeName; buildResultFromCache = (BuildResultCompiledType)BuildManager.GetBuildResultFromCache(cacheKey); } if (buildResultFromCache == null) { bool gotLock = false; try { CompilationLock.GetLock(ref gotLock); buildResultFromCache = (BuildResultCompiledType)BuildManager.GetBuildResultFromCache(str); if (buildResultFromCache == null) { buildResultFromCache = (BuildResultCompiledType)BuildManager.GetBuildResultFromCache(cacheKey); } if (buildResultFromCache != null) { return(buildResultFromCache); } VirtualPath virtualDirPath = null; VirtualPath appThemeVirtualDir = GetAppThemeVirtualDir(themeName); PageThemeBuildProvider themeBuildProvider = null; VirtualPath configPath = appThemeVirtualDir; string str3 = str; if (appThemeVirtualDir.DirectoryExists()) { themeBuildProvider = new PageThemeBuildProvider(appThemeVirtualDir); } else { virtualDirPath = GetGlobalThemeVirtualDir(themeName); if (!virtualDirPath.DirectoryExists()) { throw new HttpException(System.Web.SR.GetString("Page_theme_not_found", new object[] { themeName })); } configPath = virtualDirPath; str3 = cacheKey; themeBuildProvider = new GlobalPageThemeBuildProvider(virtualDirPath); } DateTime utcNow = DateTime.UtcNow; AddThemeFilesToBuildProvider(configPath.GetDirectory(), themeBuildProvider, true); BuildProvidersCompiler compiler = new BuildProvidersCompiler(configPath, themeBuildProvider.AssemblyNamePrefix + BuildManager.GenerateRandomAssemblyName(themeName)); compiler.SetBuildProviders(new SingleObjectCollection(themeBuildProvider)); CompilerResults results = compiler.PerformBuild(); buildResultFromCache = (BuildResultCompiledType)themeBuildProvider.GetBuildResult(results); BuildManager.CacheBuildResult(str3, buildResultFromCache, utcNow); } finally { if (gotLock) { CompilationLock.ReleaseLock(); } } } return(buildResultFromCache); }