blob: c066441968fb424caebb16f8db5494df89368f04 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
//
// System.Web.Compilation.PageCompiler
//
// Authors:
// Gonzalo Paniagua Javier (gonzalo@ximian.com)
//
// (C) 2002 Ximian, Inc (http://www.ximian.com)
//
using System;
using System.Collections;
using System.IO;
using System.Reflection;
using System.Text;
using System.Web.UI;
using System.Web.Util;
namespace System.Web.Compilation
{
class PageCompiler : BaseCompiler
{
PageParser pageParser;
string sourceFile;
Hashtable options;
private PageCompiler (PageParser pageParser)
{
this.pageParser = pageParser;
}
public override Type GetCompiledType ()
{
string inputFile = pageParser.InputFile;
sourceFile = GenerateSourceFile ();
CachingCompiler compiler = new CachingCompiler (this);
CompilationResult result = new CompilationResult ();
if (compiler.Compile (result) == false)
throw new CompilationException (result);
Assembly assembly = Assembly.LoadFrom (result.OutputFile);
Type [] types = assembly.GetTypes ();
if (types.Length != 1)
throw new CompilationException ("More than 1 Type in a page?", result);
result.Data = types [0];
return types [0];
}
public override string Key {
get {
return pageParser.InputFile;
}
}
public override string SourceFile {
get {
return sourceFile;
}
}
public override string CompilerOptions {
get {
if (options == null)
return base.CompilerOptions;
StringBuilder sb = new StringBuilder (base.CompilerOptions);
string compilerOptions = options ["CompilerOptions"] as string;
if (compilerOptions != null) {
sb.Append (' ');
sb.Append (compilerOptions);
}
string references = options ["References"] as string;
if (references == null)
return sb.ToString ();
string [] split = references.Split (' ');
foreach (string s in split)
sb.AppendFormat (" /r:{0}", s);
return sb.ToString ();
}
}
public static Type CompilePageType (PageParser pageParser)
{
CompilationCacheItem item = CachingCompiler.GetCached (pageParser.InputFile);
if (item != null && item.Result != null) {
if (item.Result != null)
return item.Result.Data as Type;
throw new CompilationException (item.Result);
}
PageCompiler pc = new PageCompiler (pageParser);
return pc.GetCompiledType ();
}
string GenerateSourceFile ()
{
string inputFile = pageParser.InputFile;
Stream input = File.OpenRead (inputFile);
AspParser parser = new AspParser (inputFile, input);
parser.Parse ();
AspGenerator generator = new AspGenerator (inputFile, parser.Elements);
generator.BaseType = pageParser.BaseType.ToString ();
generator.ProcessElements ();
pageParser.Text = generator.GetCode ().ReadToEnd ();
options = generator.Options;
//FIXME: should get Tmp dir for this application
string csName = Path.GetTempFileName () + ".cs";
WebTrace.WriteLine ("Writing {0}", csName);
StreamWriter output = new StreamWriter (File.OpenWrite (csName));
output.Write (pageParser.Text);
output.Close ();
return csName;
}
}
}
|