⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 generator.cs

📁 c#源代码
💻 CS
字号:
//
// SharpDevelop NAnt add-in.
//
// Copyright (C) 2004 Matthew Ward
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
//
// Matthew Ward (mrward@users.sourceforge.net)

using System;
using System.Collections;
using System.IO;
using System.Reflection;
using System.Xml;
using System.Xml.Xsl;
using System.Xml.XPath;

namespace ICSharpCode.NAntAddIn
{
	/// <summary>
	/// The NAnt build file generator.
	/// </summary>
	public class Generator
	{
		public static readonly string NAntBuildFileExtension = ".build";
		
		/// <summary>
		/// The xsl transform used to convert a SharpDevelop project file to a
		/// NAnt script.
		/// </summary>
		XslTransform xslTransform = new XslTransform();
		
		/// <summary>
		/// The xml resolver used with the xsl transform.
		/// </summary>
		XmlUrlResolver xmlUrlResolver = new XmlUrlResolver();
		
		/// <summary>
		/// Caches created generators.
		/// </summary>
		static Hashtable generatorsHashtable = new Hashtable();
		
		/// <summary>
		/// Creates a new instance of the <see cref="Generator"/> class.
		/// </summary>
		/// <remarks>The base folder must have a <see cref="Path.DirectorySeparatorChar"/>
		/// added to it.  The reason for this is that if the path is used in the XmlTextReader
        /// as a base uri then the uri resolution will work.  If no
        /// <see cref="Path.DirectorySeparatorChar"/> is added then the resolving
        /// process seems to get confused and removes the last folder from the
        /// base Uri, I presume it thinks this last part is a filename and not
        /// a folder.</remarks>
		/// <param name="stylesheetFilename">The stylesheet to use to generate
		/// the .build file.</param>
		Generator(string stylesheetFilename)
		{
			// Load the transform.
			string assemblyFolder = GetAssemblyFolder();
			string xslFilename = 
				Path.Combine(assemblyFolder, stylesheetFilename);
			
			// The base folder is taken from the full stylesheet path so 
			// we handle the case where the stylesheet is in a subdirectory
			// off the assembly folder.
			string baseFolder = Path.GetDirectoryName(xslFilename);
			
			// Add a directory separator after the folder name otherwise
			// the XmlUrlResolver does not resolve the imported stylesheets.
			baseFolder = String.Concat(baseFolder, Path.DirectorySeparatorChar);			
       	
        	StreamReader xslStreamReader = new StreamReader(xslFilename, true);
        	XmlTextReader xslReader = new XmlTextReader(baseFolder, xslStreamReader);
        	xslTransform.Load(xslReader, xmlUrlResolver, GetType().Assembly.Evidence);
        	xslStreamReader.Close();
        	xslReader.Close();
		}
		
		/// <summary>
		/// Creates a NAnt build file from a SharpDevelop .prjx project file.
		/// </summary>
		/// <param name="projectFilename">The SharpDevelop .prjx project filename.</param>
		/// <param name="buildFilename">The NAnt build filename that
		/// will be generated.</param>
		/// <param name="stylesheetFilename">The stylesheet to convert the
		/// project.</param>
		public static void CreateBuildFile(string projectFilename, string buildFilename, string stylesheetFilename)
		{
			Generator generator = GetGenerator(stylesheetFilename);
			generator.CreateBuildFile(projectFilename, buildFilename);
		}
		
		void CreateBuildFile(string projectFilename, string buildFilename)
		{
	  		xslTransform.Transform(projectFilename, buildFilename, xmlUrlResolver);
		}
		
		/// <summary>
        /// Gets the assembly folder where this add-in was loaded from.
        /// </summary>
        /// <returns>The assembly folder where this add-in was loaded.</returns>
        string GetAssemblyFolder()
        {
        	Assembly assembly = GetType().Assembly;
        	
        	string assemblyFilename = assembly.CodeBase.Replace("file:///", "");
        	string folder = Path.GetDirectoryName(assemblyFilename);
        
        	return folder;
        }  
        
        /// <summary>
        /// Gets the generator for the <paramref name="version"/>
        /// specified.
        /// </summary>
        /// <remarks>
        /// This method will create a new generator if one has not
        /// been created for the particular <paramref name="version"/>,
        /// otherwise it will re-use a generator.</remarks>
        /// <param name="version">The NAnt version.</param>
        /// <returns>A <see cref="Generator"/> instance.</returns>
        static Generator GetGenerator(string version)
        {
        	Generator generator = (Generator)generatorsHashtable[version];
        	if (generator == null) {
        		
        		generator = new Generator(version);
        		generatorsHashtable.Add(version, generator);
        	}
        	
        	return generator;
        }
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -