У меня есть следующий простой C# код:
using System;
using System.IO;
using RazorHosting;
namespace ConsoleApp4
{
class Context
{
public string Message { get; set; } = "Hello World!";
}
class Program
{
private const string TEMPLATE = @"
@inherits RazorHosting.RazorTemplateBase
@{
var message = Context.Message;
<tag>@message</tag>;
}
";
static void Main()
{
var razor = new RazorEngine<RazorTemplateBase>();
razor.Configuration.CompileToMemory = false;
try
{
var assemblyName = razor.ParseAndCompileTemplate(null, new StringReader(TEMPLATE));
string output = null;
if (assemblyName != null)
{
output = razor.RenderTemplateFromAssembly(assemblyName, new Context());
}
if (output == null)
{
Console.WriteLine(razor.ErrorMessage);
Console.WriteLine(razor.LastGeneratedCode);
}
else
{
Console.WriteLine(output);
}
}
catch (Exception exc)
{
Console.WriteLine(exc);
}
Console.WriteLine("Press any key to exit");
Console.ReadKey();
}
}
}
Файл csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net472</TargetFramework>
<OutputType>Exe</OutputType>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.CSharp" />
<Reference Include="RazorHosting">
<HintPath>..\lib\RazorHosting.dll</HintPath>
</Reference>
<Reference Include="System.Web.Razor">
<HintPath>..\lib\System.Web.Razor.dll</HintPath>
</Reference>
</ItemGroup>
</Project>
Единственная нетривиальная вещь в этом коде состоит в том, что он зависит от древнего RazorHosting.dll и System.Web.Razor.dll не менее 2011 года.
В любом случае код и его зависимости находятся на github в https://github.com/MarkKharitonov/TestRazor.
Моя проблема в том, что оно не работает - свойство RazorHosting.RazorTemplateBase.Context
, которое объявлено как dynamic
, ведет себя как обычный object
.
Пожалуйста, обратите внимание:
C:\Users\mkharitonov\source\repos\TestRazor [master ≡]> .\TestRazor\bin\Debug\net472\TestRazor.exe
Template Execution Error: 'object' does not contain a definition for 'Message'
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace @__RazorHost {
using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using System.IO;
public class _0d852a7d_8d4d_4472_a337_b511872b9dbe : RazorHosting.RazorTemplateBase {
#line hidden
public _0d852a7d_8d4d_4472_a337_b511872b9dbe() {
}
public override void Execute() {
WriteLiteral("\r\n");
var message = Context.Message;
WriteLiteral(" <tag>");
Write(message);
WriteLiteral("</tag>");
;
WriteLiteral("\r\n");
}
}
}
Press any key to exit
C:\Users\mkharitonov\source\repos\TestRazor [master ≡]>
Теперь у меня есть ограничение - я не могу использовать последние движки Razor, потому что реальный код Razor у нас довольно большой и старый, и его нелегко переносить. Переход на самую последнюю реализацию движка Razor в настоящее время исключен. Пожалуйста, не предлагайте это.
Итак, учитывая мой простой код - что не так? Почему Dynami c не работает?