Razor 使用“;剃须刀&x201D;在ASPNET Core 2.0之外
有没有人用过AspnetCore2.0?我想用它来代替非常依赖VisualStudio的T4模板 我已经设法获得了C#中间代码,但仍然无法将其再次转换为字符串 1) 我走对了吗 2) 如何执行生成的C#代码(以字符串形式)?如果可能的话,我希望它与ASPNET CORE一样 C#(生成器代码针对堆栈溢出进行了扩展) Views\MyView.cshtmlRazor 使用“;剃须刀&x201D;在ASPNET Core 2.0之外,razor,asp.net-core,asp.net-core-2.0,Razor,Asp.net Core,Asp.net Core 2.0,有没有人用过AspnetCore2.0?我想用它来代替非常依赖VisualStudio的T4模板 我已经设法获得了C#中间代码,但仍然无法将其再次转换为字符串 1) 我走对了吗 2) 如何执行生成的C#代码(以字符串形式)?如果可能的话,我希望它与ASPNET CORE一样 C#(生成器代码针对堆栈溢出进行了扩展) Views\MyView.cshtml @{ string[]成员={“Jani”、“Hege”、“Kai”、“Jim”}; int i=数组.IndexOf(成员,“Kai”)+
@{
string[]成员={“Jani”、“Hege”、“Kai”、“Jim”};
int i=数组.IndexOf(成员,“Kai”)+1;
int len=成员。长度;
字符串x=成员[2-1];
}
时间是@DateTime.UtcNow
@foreach(成员中的var人员)
{
@人
}
成员中的名称数为@len
位置2的人是@x
Kai现在处于@i位置
@{
var j=0;
而(j<5)
{
j+=1;
第@j行
}
}
输出字符串(C#代码)
//
#pragma警告禁用1591
命名空间运行时命名空间
{
#隐藏线
使用制度;
使用System.Threading.Tasks;
内部类TestView:BaseView
{
#布拉格警告禁用1998
公共异步覆盖全局::System.Threading.Tasks.Task ExecuteAsync()
{
#第1行“TestView.cshtml”
string[]成员={“Jani”、“Hege”、“Kai”、“Jim”};
int i=数组.IndexOf(成员,“Kai”)+1;
int len=成员。长度;
字符串x=成员[2-1];
#行默认值
#隐藏线
Writeleteral(“\n\n\n时间是”);
#第10行“TestView.cshtml”
写入(DateTime.UtcNow);
#行默认值
#隐藏线
书面通知(“\n”);
#第11行“TestView.cshtml”
foreach(成员中的var人员)
{
#行默认值
#隐藏线
书面概述();
#第13行“TestView.cshtml”
写(人);
#行默认值
#隐藏线
书面的(“\n”);
#第14行“TestView.cshtml”
}
#行默认值
#隐藏线
Writeleteral(“\n成员中的姓名数为”);
#第16行“TestView.cshtml”
写(len);
#行默认值
#隐藏线
书面概述(“第2位的人是”);
#第17行“TestView.cshtml”
写(x);
#行默认值
#隐藏线
Writeleteral(“\nKai现在就位”);
#第18行“TestView.cshtml”
编写(i);
#行默认值
#隐藏线
Writeleteral(“\n\n”);
#第20行“TestView.cshtml”
var j=0;
而(j<5)
{
j+=1;
#行默认值
#隐藏线
书面的(“p>行”);
#第25行“TestView.cshtml”
写(j);
#行默认值
#隐藏线
书面的(“\n”);
#第26行“TestView.cshtml”
}
#行默认值
#隐藏线
writeleral(“\n\n\n\n\n”);
}
#布拉格警告恢复1998
}
}
#pragma警告恢复1591
我想说得很接近。您可能还想查看as,它在后台以非常类似的方式使用Razor(这是Visual Studio中为ASP.net核心项目本机使用的脚手架工具)
MyBaseView
与您的略有不同,但您似乎只需要执行以下操作:
Type compiledType=Compile(cSharpDocument.GeneratedCode);
BaseView razorTemplate=(BaseView)Activator.CreateInstance(compiledType);
var result=await razorTemplate.ExecuteAsync();
字符串输出=razorTemplate.ToString();
其中Compile
和GetAssembly
实现如下:
私有类型编译(字符串内容)
{
SyntaxTree[]syntaxTrees=new[]{CSharpSyntaxTree.ParseText(content)};
字符串dummySassemblyName=Path.GetRandomFileName();
csharpcomilation=csharpcomilation.Create(dummyAssemblyName,
选项:新的CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary),
合成树:合成树,
参考文献:_参考文献);
汇编结果=GetAssembly(编译);
Type Type=result.GetExportedTypes().First();
返回类型;
}
私有静态程序集GetAssembly(编译)
{
使用(MemoryStream ms=new MemoryStream())
{
EmitResult=compilation.Emit(毫秒);
如果(!result.Success)
{
DiagnosticFormatter formatter=新的DiagnosticFormatter();
IEnumerable errorMessages=result.Diagnostics
.其中(d=>d.IsWarningAsError | | d.Severity==DiagnosticSeverity.Error)
.Select(d=>formatter.Format(d));
抛出新异常($”编译程序集时遇到错误:{String.Join(Environment.NewLine,errorMessages)});
}
Seek女士(0,SeekOrigin.Begin);
Assembly Assembly=AssemblyLoadContext.Default.LoadFromStream(ms);
返回组件;
}
}