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