Я пытаюсь определить во время выполнения, был ли изменен исходный код метода класса. В основном я извлекаю тело метода (IL), хеширую его с помощью md5 и сохраняю в базе данных. В следующий раз, когда я проверю метод, я могу сравнить хэши.
public class Changed
{
public string SomeValue { get; set; }
public string GetSomeValue()
{
return SomeValue + "add something";
}
public async Task<string> GetSomeValueAsync()
{
return await Task.FromResult(SomeValue + "add something");
}
}
Я использую Mono.Cecil для извлечения тел методов:
var module = ModuleDefinition.ReadModule("MethodBodyChangeDetector.exe");
var typeDefinition = module.Types.First(t => t.FullName == typeof(Changed).FullName);
// Retrieve all method bodies (IL instructions as string)
var methodInstructions = typeDefinition.Methods
.Where(m => m.HasBody)
.SelectMany(x => x.Body.Instructions)
.Select(i => i.ToString());
var hash = Md5(string.Join("", methodInstructions));
Это прекрасно работает, за исключением методов, помеченных как асинхронные. Всякий раз, когда я добавляю код в метод SomeValue, хеш изменяется. Всякий раз, когда я добавляю код в метод GetSomeValueAsync, хэш не меняется. Кто-нибудь знает, как определить, изменилось ли тело метода асинхронного метода?
async
(как и в методахyield
) реализовано довольно большое моджо. - person xanatos   schedule 21.03.2015GetMethodBody().GetILAsByteArray()
/GetMethodBody().LocalVariables
- person xanatos   schedule 21.03.2015ldstr
из специальной таблицы - person xanatos   schedule 21.03.2015