Обновление токена метаданных Mono.Cecil - PullRequest
0 голосов
/ 14 января 2020

В настоящее время я работаю над своего рода. NET сборкой протектор / патчер.

Проблема заключается в том, что после какого-то динамического внедрения кода c (выполняется через MethodBody.ILProcessor. Emit () семейство подпрограмм) вновь добавленные типы, методы и другие артефакты, взятые из уже скомпилированной сборки шаблонов, должны быть помещены в целевую сборку. Таким образом, после внедрения будет изменена целевая сборка без ссылок на сборку шаблона. После таких операций (типы, методы и т. Д. c копирование) токены метаданных введенных артефактов (типы, методы и т. Д. c) становятся недействительными (т. Е. Все MethodDefinition -ы из сборки шаблона после копирования в целевую сборку получите токены метаданных, соответствующие MethodDefinition -s с RID == 0). Но попытка сохранить целевую сборку не дает никакого эффекта, поскольку она уже используется и, следовательно, заблокирована для записи, несмотря на то, что целевая сборка загружается как:
AssemblyDefinition target = AssemblyDefinition.ReadAssembly(path, new ReaderParameters(ReadingMode.Immediate));

Итак, мой вопрос: есть ли способ (в Mono.Cecil) заставить все токены метаданных обновляться иерархически (т.е. получать такие RID, что RID! = 0), без фактической записи файла? Или хотя бы назначать / распространять токены метаданных вручную?

PS Заранее спасибо!

...