VS单文件生成器中的RazorEngine太慢了

时间:2018-01-24 03:27:02

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

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

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

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

{{1}}

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

1 个答案:

答案 0 :(得分:0)

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

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));