【问题标题】:RazorEngine within VS single file generator is too slowVS单文件生成器中的RazorEngine太慢
【发布时间】:2018-01-24 03:27:01
【问题描述】:

我正在开发一个 Visual Studio 自定义工具(单文件生成器),它为每个选定的剃须刀页面(*.cshtml)生成一个 .vue 文件,该项目基于微软的单文件生成器示例项目 [https://github.com/Microsoft/VSSDK-Extensibility-Samples/tree/master/Single_File_Generator] ,我正在使用RazorEngine 解析剃须刀模板,一切正常,除了 RazorEngine 花了很多时间(超过 20 秒)来编译剃须刀模板文件并导致 VS 挂起而没有响应,我查看了任务管理器并注意到在此自定义工具运行时有一个 Visual C# 命令行编译器占用了很高的 CPU 使用率,我的代码如下:

protected override byte[] GenerateCode(string inputFileContent)
        {
            try
            {
                var result=Engine.Razor.RunCompile(inputFileContent,DateTime.Now.Ticks.ToString());
                return System.Text.Encoding.UTF8.GetBytes(result);
            }
            catch (Exception e)
            {
                this.GeneratorError(4, e.ToString(), 1, 1);
                //Returning null signifies that generation has failed
                return null;
            }
        }

问题是由这行代码引起的:

Engine.Razor.RunCompile(inputFileContent,DateTime.Now.Ticks.ToString());

但是当我在控制台应用程序中运行它时,只需要几毫秒即可完成,我google了一整天都无法解决这个问题,请帮助我!谢谢!

【问题讨论】:

  • 有谁知道是什么导致了这个问题?谢谢!

标签: c# visual-studio-2017 razorengine single-file-generator


【解决方案1】:

仔细查看您作为模板键传递的内容:

DateTime.Now.Ticks.ToString()

基本上,每次运行RunCompile() 时都会创建一个新的缓存条目。如果模板已经编译,您需要做的是重用密钥。

您可以通过以下方式处理:

为模板生成哈希和:

using MD5 = System.Security.Cryptography.MD5;
...
public static class HashGenerator
{
    public static string GenerateCheckSumHash(string input)
    {
        using (MD5 md5 = MD5.Create())
        {
            byte[] inputBytes = Encoding.ASCII.GetBytes(input);
            byte[] hashBytes = md5.ComputeHash(inputBytes);

            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < hashBytes.Length; i++)
            {
                sb.Append(hashBytes[i].ToString("X2"));
            }
            return sb.ToString();
        }
    }
}

使用哈希和作为模板键:

var result = Engine.Razor.RunCompile(inputFileContent,
    HashGenerator.GenerateCheckSumHash(inputFileContent));

【讨论】:

  • 感谢您的帮助!模板键没问题,我之前已经用过的hash sum方法和结果是一样的。模板是用户在 Visual Studio IDE 中编辑的文件,不需要缓存。我通过使用 IsolatedRazorEngineService 创建一个新的 AppDomain 解决了这个编译速度慢的问题,但是引用的程序集无法加载到这个新的 appdomain 中,并且引用的代码无法编译。我已经放弃创建这个 VS 扩展,而是在项目中编译 razor 文件。再次感谢!
  • @Webdiyer 你能分享我如何使用 appDomain isolatedRazor 服务来缓存模板以快速加载吗?谢谢
猜你喜欢
  • 2016-09-29
  • 2019-02-12
  • 1970-01-01
  • 2013-08-17
  • 1970-01-01
  • 2013-12-05
  • 1970-01-01
  • 1970-01-01
  • 2021-10-09
相关资源
最近更新 更多