![]() |
General Programming »
Algorithms & Recipes »
Parsers and Interpreters
Intermediate
License: The Code Project Open License (CPOL)
AspExe - a small ASP.NET compiler and executor for document generationBy Herre KuijpersAspExe is a small command line tool that will take an .aspx file and compile and execute (=render) it. |
C# (C# 1.0, C# 2.0, C# 3.0), .NET (.NET 2.0, .NET 3.0, .NET 3.5)VS2008, Dev
|
|
Advanced Search Add to IE Search |
|
|
|
||||||||||||||||

AspExe is a small command line tool that will take an .aspx file and then compile and execute (=render) it. The output is saved to a specified output file. To use the tool, execute the following command on the command line:
aspexe.exe driveinfo.aspx output.html
After executing driveinfo.aspx, the output.html file is generated. Opening this file in a browser should result in something as shown at the top of this article. In this particular example, the drive information is dynamically read and generated from the aspx page.
Warning: this tool will work only with a subset of .aspx pages. For details, see the advantages and limitations section further on in this article.
So, I started to ponder, what kind of framework could fill this need? Creating XML or HTML pages as output using ASP.NET would seem ideal, if it weren't for the fact that these pages are required to be hosted on an Internet Information Server. This is hardly the kind of lightweight solution I wanted to embed inside my Windows application.
So, I decided to create a lightweight template parser/compiler/executor that could read .aspx files and create an output text file (or any other text format) much like it is handled in IIS. Hence the AspExe project was born.
AspExe is a small wrapper around a template class. The template class contains a parser, compiler, and executor of a template page. Basically, what the AspExe does is the following:
Response object.Response object to an output file.Because internally C# code is generated, and since C# code can be embedded inside templates, you have access to the full .NET framework, even from within the templates.
The best advantage of all, however I find, is that the template is an aspx file. This means, the template can be edited inside Visual Studio, with full support for IntelliSense! Writing templates has never been easier!!
Note, however, that AspExe does have some restrictions:
You can only execute a limited set of .aspx files. AspExe, for instance, does not bother with code-behind files. All scripting must be contained within the aspx page.
Also, only a few directives are supported: @Page, @Assembly, and @Import. All other directives are ignored. So, for instance, including Web controls inside the page will not work.
Using the code is simple. Add the Template*.cs files to your project and add the AspExe namespace. Then, execute the following code example to load, parse, compile, and execute an .aspx template and save it to an output file:
// three steps to compile and execute an ASP.NET aspx file:
// step 1: load the .aspx template file, e.g. the default page
Template template = new Template(@"Default.aspx");
// step 2: compile the template. Don't worry about
// compiler errors. If any, those will be exported to the output file
template.Compile();
// step 3: execute the compiled template. run time errors are exported to the output file.
template.Execute(@"output.html");
Optionally, it is possible to also pass parameters and runtime information to the template on execution.
// define a 'domain' object to pass on to the template,
// e.g. the current user information.
System.Security.Principal.WindowsIdentity user =
System.Security.Principal.WindowsIdentity.GetCurrent();
// create a template parameter collection object
TemplateParameters tps = new TemplateParameters();
// Add a new parameter to the collection.
// Note that the "CurrentUser"
// must be declared publicly inside the template.
tps.Add(user.GetType(), "CurrentUser", user);
// execute the template passing on the collection with parameters.
template.Execute(targetFile, tps);
In order for the template to use the user information, it is required that the CurrentUser is declared in the template. This can be done as follows:
//inside the template declare a SCRIPT section:
<SCRIPT runat="Server">
public System.Security.Principal.WindowsIdentity CurrentUser;
</SCRIPT>
Note that it is imperative that the runat="Server" attribute is included inside the <SCRIPT> tag. Otherwise, the code block will not be included by the parser and the compiler. Note that this is also required by ASP.NET. The script tag allows you to declare variables and also to define your own methods and functions.
Using this concept can potentially be very powerful. Specially because it is not required to output HTML, but XML or even CSV. Creating the right output XML could result in files that can be read as Excel or Visio. As an example, I included the "driveinfo2excel.aspx" file which exports drive information to an Excel file. Run the following command:
aspexe.exe driveinfo2excel.aspx output.xls
The output.xls can be opened directly in MS Excel.
Another point of interest is the support for the @Assembly and @Import directives. This allows the template to reference third party or your own libraries (it is required to be a .dll though). Code in the template will be able to access the functionality in the referenced assembly. E.g.: <%@ Assembly Name="MyLibrary" %>. Note that you must exclude the .dll extension.
The @Import directive allows you to declare a namespace to use inside the template. E.g., you can import your own assembly and then declare the namespaces used in the assembly. Example: <%@ Import Namespace="System.IO" %>
Hopefully, this project is useful for developers out there. I am interested in hints or suggestions for improvement, but I would also like to know the alternatives. If you have any, let me know why it would be an improvement or a better alternative.
| You must Sign In to use this message board. | ||||||||||||||||||||||
|
||||||||||||||||||||||
|
||||||||||||||||||||||
|
||||||||||||||||||||||
|
||||||||||||||||||||||
General
News
Question
Answer
Joke
Rant
Admin
|
PermaLink |
Privacy |
Terms of Use
Last Updated: 4 Jan 2008 Editor: Smitha Vijayan |
Copyright 2008 by Herre Kuijpers Everything else Copyright © CodeProject, 1999-2009 Web21 | Advertise on the Code Project |