@@ -17,15 +17,20 @@ public class RazorEngine : IRazorEngine
1717 public IRazorEngineCompiledTemplate < T > Compile < T > ( string content , Action < IRazorEngineCompilationOptionsBuilder > builderAction = null ) where T : IRazorEngineTemplate
1818 {
1919 IRazorEngineCompilationOptionsBuilder compilationOptionsBuilder = new RazorEngineCompilationOptionsBuilder ( ) ;
20-
2120 compilationOptionsBuilder . AddAssemblyReference ( typeof ( T ) . Assembly ) ;
2221 compilationOptionsBuilder . Inherits ( typeof ( T ) ) ;
2322
2423 builderAction ? . Invoke ( compilationOptionsBuilder ) ;
25-
26- MemoryStream memoryStream = this . CreateAndCompileToStream ( content , compilationOptionsBuilder . Options ) ;
27-
28- return new RazorEngineCompiledTemplate < T > ( memoryStream , compilationOptionsBuilder . Options . TemplateNamespace ) ;
24+ if ( compilationOptionsBuilder . Options . GeneratePdbStream )
25+ {
26+ CompiledStreams streams = this . CreateAndCompileToStream ( content , compilationOptionsBuilder . Options ) ;
27+ return new RazorEngineCompiledTemplate < T > ( streams . assembly , compilationOptionsBuilder . Options . TemplateNamespace , streams . pdb ) ;
28+ }
29+ else
30+ {
31+ CompiledStreams streams = this . CreateAndCompileToStream ( content , compilationOptionsBuilder . Options ) ;
32+ return new RazorEngineCompiledTemplate < T > ( streams . assembly , compilationOptionsBuilder . Options . TemplateNamespace ) ;
33+ }
2934 }
3035
3136 public Task < IRazorEngineCompiledTemplate < T > > CompileAsync < T > ( string content , Action < IRazorEngineCompilationOptionsBuilder > builderAction = null ) where T : IRazorEngineTemplate
@@ -39,30 +44,45 @@ public IRazorEngineCompiledTemplate Compile(string content, Action<IRazorEngineC
3944 compilationOptionsBuilder . Inherits ( typeof ( RazorEngineTemplateBase ) ) ;
4045
4146 builderAction ? . Invoke ( compilationOptionsBuilder ) ;
47+ if ( compilationOptionsBuilder . Options . GeneratePdbStream )
48+ {
49+ CompiledStreams streams = this . CreateAndCompileToStream ( content , compilationOptionsBuilder . Options ) ;
50+ return new RazorEngineCompiledTemplate ( streams . assembly , compilationOptionsBuilder . Options . TemplateNamespace , streams . pdb ) ;
51+ }
52+ else
53+ {
54+ CompiledStreams streams = this . CreateAndCompileToStream ( content , compilationOptionsBuilder . Options ) ;
55+ return new RazorEngineCompiledTemplate ( streams . assembly , compilationOptionsBuilder . Options . TemplateNamespace ) ;
56+ }
4257
43- MemoryStream memoryStream = this . CreateAndCompileToStream ( content , compilationOptionsBuilder . Options ) ;
44-
45- return new RazorEngineCompiledTemplate ( memoryStream , compilationOptionsBuilder . Options . TemplateNamespace ) ;
4658 }
4759
4860 public Task < IRazorEngineCompiledTemplate > CompileAsync ( string content , Action < IRazorEngineCompilationOptionsBuilder > builderAction = null )
4961 {
5062 return Task . Factory . StartNew ( ( ) => this . Compile ( content : content , builderAction : builderAction ) ) ;
5163 }
5264
53- protected virtual MemoryStream CreateAndCompileToStream ( string templateSource , RazorEngineCompilationOptions options )
65+ protected virtual CompiledStreams CreateAndCompileToStream ( string templateSource , RazorEngineCompilationOptions options , MemoryStream pdbStream = null )
5466 {
5567 templateSource = this . WriteDirectives ( templateSource , options ) ;
68+ string projectPath = @"." ;
69+ string fileName = string . IsNullOrWhiteSpace ( options . TemplateFilename ) ? Path . GetRandomFileName ( ) + ".cshtml" : options . TemplateFilename ;
70+
71+ if ( options . GeneratePdbStream )
72+ {
73+ projectPath = Path . GetTempPath ( ) ;
74+ Directory . CreateDirectory ( projectPath ) ;
75+ File . WriteAllText ( Path . Combine ( projectPath , fileName ) , templateSource ) ;
76+ }
5677
5778 RazorProjectEngine engine = RazorProjectEngine . Create (
5879 RazorConfiguration . Default ,
59- RazorProjectFileSystem . Create ( @"." ) ,
80+ RazorProjectFileSystem . Create ( projectPath ) ,
6081 ( builder ) =>
6182 {
6283 builder . SetNamespace ( options . TemplateNamespace ) ;
6384 } ) ;
6485
65- string fileName = string . IsNullOrWhiteSpace ( options . TemplateFilename ) ? Path . GetRandomFileName ( ) : options . TemplateFilename ;
6686
6787 RazorSourceDocument document = RazorSourceDocument . Create ( templateSource , fileName ) ;
6888
@@ -73,7 +93,6 @@ protected virtual MemoryStream CreateAndCompileToStream(string templateSource, R
7393 new List < TagHelperDescriptor > ( ) ) ;
7494
7595 RazorCSharpDocument razorCSharpDocument = codeDocument . GetCSharpDocument ( ) ;
76-
7796 SyntaxTree syntaxTree = CSharpSyntaxTree . ParseText ( razorCSharpDocument . GeneratedCode ) ;
7897
7998 CSharpCompilation compilation = CSharpCompilation . Create (
@@ -102,10 +121,12 @@ protected virtual MemoryStream CreateAndCompileToStream(string templateSource, R
102121 . Concat ( options . MetadataReferences )
103122 . ToList ( ) ,
104123 new CSharpCompilationOptions ( OutputKind . DynamicallyLinkedLibrary ) ) ;
105-
106- MemoryStream memoryStream = new MemoryStream ( ) ;
107-
108- EmitResult emitResult = compilation . Emit ( memoryStream ) ;
124+ CompiledStreams streams = new CompiledStreams ( ) ;
125+ EmitResult emitResult ;
126+ if ( options . GeneratePdbStream )
127+ emitResult = compilation . Emit ( streams . assembly , streams . pdb ) ;
128+ else
129+ emitResult = compilation . Emit ( streams . assembly ) ;
109130
110131 if ( ! emitResult . Success )
111132 {
@@ -118,9 +139,10 @@ protected virtual MemoryStream CreateAndCompileToStream(string templateSource, R
118139 throw exception ;
119140 }
120141
121- memoryStream . Position = 0 ;
122-
123- return memoryStream ;
142+ streams . assembly . Position = 0 ;
143+ if ( options . GeneratePdbStream )
144+ streams . pdb . Position = 0 ;
145+ return streams ;
124146 }
125147
126148 protected virtual string WriteDirectives ( string content , RazorEngineCompilationOptions options )
@@ -137,5 +159,16 @@ protected virtual string WriteDirectives(string content, RazorEngineCompilationO
137159
138160 return stringBuilder . ToString ( ) ;
139161 }
162+
163+ protected class CompiledStreams
164+ {
165+ public CompiledStreams ( )
166+ {
167+ assembly = new MemoryStream ( ) ;
168+ pdb = new MemoryStream ( ) ;
169+ }
170+ public MemoryStream assembly { get ; set ; }
171+ public MemoryStream pdb { get ; set ; }
172+ }
140173 }
141- }
174+ }
0 commit comments