RazorEngine в генераторе одиночных файлов VS работает слишком медленно

Я разрабатываю пользовательский инструмент Visual Studio (генератор одного файла), который генерирует файл.vue для каждой выбранной страницы бритвы (*. Cshtml), проект основан на примере проекта Microsoft для генератора одиночных файлов [ https://github.com/Microsoft/VSSDK-Extensibility-Samples/tree/master/Single_File_Generator], я использую RazorEngine для разбора шаблона бритвы, все работает как положено, за исключением того, что RazorEngine потребовалось много времени (более 20 секунд) для компиляции бритвы Файл шаблона и вызвавший зависание VS без ответа, я заглянул в диспетчер задач и заметил, что есть компилятор командной строки Visual C#, который потреблял много ресурсов ЦП, пока этот пользовательский инструмент работает, мой код выглядит следующим образом:

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

Но когда я запускаю его в консольном приложении, это занимает всего несколько миллисекунд, я гуглил целый день и не могу решить эту проблему, пожалуйста, помогите мне! Спасибо!

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));
Другие вопросы по тегам