从Razor模板引擎3.3.0升级到3.6.1后,我遇到了预编译模板的问题 - 即使是在页面上给出的琐碎样本,也会发生这样的事情:
using System;
using RazorEngine;
using RazorEngine.Templating;
using System.Diagnostics;
namespace RazorTest
{
class Program
{
static void Main(string[] args)
{
string template = "Hello @Model.Name, welcome to RazorEngine!";
Debug.WriteLine("Before Compile()");
var result = Engine.Razor.RunCompile(template, "templateKey", null, new { Name = "World" });
Debug.WriteLine("After Compile()");
}
}
}
Run Code Online (Sandbox Code Playgroud)
System.UnauthorizedAccessException尝试删除生成的dll文件时抛出退出.调试输出很好地显示了一切:
Before Compile()
'RazorTest.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:\Users\user\Documents\Visual Studio 2010\Projects\RazorTest\RazorTest\bin\Debug\System.Web.Razor.dll'
'RazorTest.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:\Users\user\AppData\Local\Temp\RazorEngine_zzxr14ak.ysb\CompiledRazorTemplates.Dynamic.RazorEngine_dc2066212315402592a6d2d155476c19.dll'
'RazorTest.vshost.exe' (Managed (v4.0.30319)): Loaded 'Anonymously Hosted DynamicMethods Assembly'
'RazorTest.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Dynamic\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Dynamic.dll'
A first chance exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' occurred in Microsoft.CSharp.dll
A first chance exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' occurred in Microsoft.CSharp.dll
After Compile()
The thread 'vshost.RunParkingWindow' (0x3064) has exited with code 0 (0x0).
The thread '<No Name>' (0x2df0) has exited with code 0 (0x0).
A first chance exception of type 'System.UnauthorizedAccessException' occurred in mscorlib.dll
A first chance exception of type 'System.UnauthorizedAccessException' occurred in mscorlib.dll
A first chance exception of type 'System.UnauthorizedAccessException' occurred in mscorlib.dll
The program '[26908] RazorTest.vshost.exe: Managed (v4.0.30319)' has exited with code 0 (0x0).
Run Code Online (Sandbox Code Playgroud)
应用程序在编译期间加载了dll文件,因此如果没有进行某种卸载,Razor将无法删除它,并且文件将保留在磁盘上.
即使模型的类型被赋予Razor认为模板是动态的(至少从dll名称判断),还有什么看起来很奇怪.
有没有更多经验的Razor遇到过这个或者可以提供一些如何克服这个问题的提示?
临时文件存在问题,已在3.6.4(大部分)中修复.如果您需要详细信息,请阅读https://github.com/Antaris/RazorEngine/issues/244.还有first chance exceptions of type 'System.UnauthorizedAccessException',但他们在内部由RazorEngine处理.
事实上,您的模板是dyanmic作为模型类型编译的,因为您已将参数null = dynamic作为modeltype参数.
如果要使用静态类型编译模板
Engine.Razor.RunCompile(template, "templateKey", typeof(MyModel), new MyModel());
Run Code Online (Sandbox Code Playgroud)
我们将类型显式化的原因是因为您现在可以通过指定公共基类型或通过显式使用来重用多个类型的相同模板null = dynamic:
// Will compile only once
Engine.Razor.RunCompile(template, "templateKey", typeof(MyBaseModel), new MyModel1());
Engine.Razor.RunCompile(template, "templateKey", typeof(MyBaseModel), new MyModel2());
// Will start a new compilation, and load another assembly
Engine.Razor.RunCompile(template, "templateKey", typeof(MyModel3), new MyModel3());
Run Code Online (Sandbox Code Playgroud)
这个工作只要MyModel1和MyMode2继承MyBaseModel.或者您可以使用动态:
// Will compile only once
Engine.Razor.RunCompile(template, "templateKey", null, new FirstModel());
Engine.Razor.RunCompile(template, "templateKey", null, new SecondModel());
Run Code Online (Sandbox Code Playgroud)
请注意,使用动态模型甚至不需要从相同的基类型继承.只要FirstModel和SecondModel所有的属性,这是由模板要求,它会工作(但它会在模板编译,但在模板运行时不会失败).
这对包含和布局模板特别有用(现在可以更加自定义).
希望这可以帮助.matthid,RazorEngine的贡献者.
| 归档时间: |
|
| 查看次数: |
4071 次 |
| 最近记录: |