Невозможно заставить Dynami c работать во время рендеринга тривиального шаблона бритвы. - PullRequest
0 голосов
/ 18 марта 2020

У меня есть следующий простой 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 не работает?

...