| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- //
- // System.Web.Compilation.AppResourceAseemblyBuilder
- //
- // Authors:
- // Marek Habersack ([email protected])
- //
- // (C) 2007 Novell, Inc
- //
- //
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the
- // "Software"), to deal in the Software without restriction, including
- // without limitation the rights to use, copy, modify, merge, publish,
- // distribute, sublicense, and/or sell copies of the Software, and to
- // permit persons to whom the Software is furnished to do so, subject to
- // the following conditions:
- //
- // The above copyright notice and this permission notice shall be
- // included in all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- //
- #if NET_2_0
- using System;
- using System.CodeDom;
- using System.CodeDom.Compiler;
- using System.Collections.Generic;
- using System.IO;
- using System.Reflection;
- using System.Web;
- using System.Web.Configuration;
- namespace System.Web.Compilation
- {
- internal class AppResourcesAssemblyBuilder
- {
- CompilationSection config;
- CompilerInfo ci;
- CodeDomProvider _provider;
- string baseAssemblyPath;
- string baseAssemblyDirectory;
- string canonicAssemblyName;
- Assembly mainAssembly;
- AppResourcesCompiler appResourcesCompiler;
-
- public CodeDomProvider Provider {
- get {
- if (_provider == null)
- _provider = ci.CreateProvider ();
- else
- return _provider;
-
- if (_provider == null)
- throw new ApplicationException ("Failed to instantiate the default compiler.");
- return _provider;
- }
- }
-
- public Assembly MainAssembly {
- get { return mainAssembly; }
- }
-
- public AppResourcesAssemblyBuilder (string canonicAssemblyName, string baseAssemblyPath, AppResourcesCompiler appres)
- {
- this.appResourcesCompiler = appres;
- this.baseAssemblyPath = baseAssemblyPath;
- this.baseAssemblyDirectory = Path.GetDirectoryName (baseAssemblyPath);
- this.canonicAssemblyName = canonicAssemblyName;
-
- config = WebConfigurationManager.GetSection ("system.web/compilation") as CompilationSection;
- if (config == null || !CodeDomProvider.IsDefinedLanguage (config.DefaultLanguage))
- throw new ApplicationException ("Could not get the default compiler.");
- ci = CodeDomProvider.GetCompilerInfo (config.DefaultLanguage);
- if (ci == null || !ci.IsCodeDomProviderTypeValid)
- throw new ApplicationException ("Failed to obtain the default compiler information.");
- }
- public void Build ()
- {
- Build (null);
- }
-
- public void Build (CodeCompileUnit unit)
- {
- Dictionary <string, List <string>> cultures = appResourcesCompiler.CultureFiles;
- string defaultAssemblyKey = AppResourcesCompiler.DefaultCultureKey;
-
- foreach (KeyValuePair <string, List <string>> kvp in cultures)
- BuildAssembly (kvp.Key, kvp.Value, defaultAssemblyKey, unit);
- }
- void BuildAssembly (string cultureName, List <string> files, string defaultAssemblyKey, CodeCompileUnit unit)
- {
- bool defaultAssembly = cultureName == defaultAssemblyKey;
- AssemblyBuilder abuilder = new AssemblyBuilder (Provider);
- if (unit != null && defaultAssembly)
- abuilder.AddCodeCompileUnit (unit);
-
- string assemblyPath = defaultAssembly ? baseAssemblyPath : BuildAssemblyPath (cultureName, abuilder);
- CompilerParameters cp = ci.CreateDefaultCompilerParameters ();
- cp.OutputAssembly = assemblyPath;
- cp.GenerateExecutable = false;
- cp.TreatWarningsAsErrors = true;
- cp.IncludeDebugInformation = config.Debug;
- foreach (string f in files)
- cp.EmbeddedResources.Add (f);
-
- CompilerResults results = abuilder.BuildAssembly (cp);
- Assembly ret = null;
-
- if (results.NativeCompilerReturnValue == 0) {
- ret = results.CompiledAssembly;
- if (defaultAssembly) {
- BuildManager.TopLevelAssemblies.Add (ret);
- mainAssembly = ret;
- }
- } else {
- if (HttpContext.Current.IsCustomErrorEnabled)
- throw new ApplicationException ("An error occurred while compiling global resources.");
- throw new CompilationException (null, results.Errors, null);
- }
-
- if (defaultAssembly) {
- HttpRuntime.WritePreservationFile (ret, canonicAssemblyName);
- HttpRuntime.EnableAssemblyMapping (true);
- }
- }
- string BuildAssemblyPath (string cultureName, AssemblyBuilder abuilder)
- {
- string baseDir = Path.Combine (baseAssemblyDirectory, cultureName);
- if (!Directory.Exists (baseDir))
- Directory.CreateDirectory (baseDir);
-
- string baseFileName = Path.GetFileNameWithoutExtension (baseAssemblyPath);
- string fileName = String.Concat (baseFileName, ".resources.dll");
- fileName = Path.Combine (baseDir, fileName);
- CodeCompileUnit assemblyInfo = GenerateAssemblyInfo (cultureName);
- if (assemblyInfo != null)
- abuilder.AddCodeCompileUnit (assemblyInfo);
- return fileName;
- }
- CodeCompileUnit GenerateAssemblyInfo (string cultureName)
- {
- CodeAttributeArgument[] args = new CodeAttributeArgument [1];
- args [0] = new CodeAttributeArgument (new CodePrimitiveExpression (cultureName));
- CodeCompileUnit unit = new CodeCompileUnit ();
- unit.AssemblyCustomAttributes.Add (
- new CodeAttributeDeclaration (
- new CodeTypeReference ("System.Reflection.AssemblyCultureAttribute"),
- args));
- args = new CodeAttributeArgument [2];
- args [0] = new CodeAttributeArgument (new CodePrimitiveExpression ("ASP.NET"));
- args [1] = new CodeAttributeArgument (new CodePrimitiveExpression (Environment.Version.ToString ()));
- unit.AssemblyCustomAttributes.Add (
- new CodeAttributeDeclaration (
- new CodeTypeReference ("System.CodeDom.Compiler.GeneratedCodeAttribute"),
- args));
-
- return unit;
- }
- }
- }
- #endif
|