Razor 使用“;剃须刀&x201D;在ASPNET Core 2.0之外

Razor 使用“;剃须刀&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”)+

有没有人用过AspnetCore2.0?我想用它来代替非常依赖VisualStudio的T4模板

我已经设法获得了C#中间代码,但仍然无法将其再次转换为字符串

1) 我走对了吗

2) 如何执行生成的C#代码(以字符串形式)?如果可能的话,我希望它与ASPNET CORE一样

C#(生成器代码针对堆栈溢出进行了扩展)

Views\MyView.cshtml

@{
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核心项目本机使用的脚手架工具)

My
BaseView
与您的略有不同,但您似乎只需要执行以下操作:

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);
返回组件;
}
}