Запись поверх сборок с использованием Mono.Cecil
Я пытаюсь переписать сборку, которая в данный момент загружена в AppDomain с использованием Mono.Cecil, и я получаю сообщение об ошибке ввода-вывода о том, что файл используется. В настоящий момент я создаю сборку с использованием AssemblyDefinitiion.Create(), внося любые необходимые изменения, а затем записываю поверх Assembly с использованием AssemblyDefinition.Write(). Из того, что я понимаю в Mono.Cecil, должна быть возможность записи поверх существующей сборки, но есть ли другие шаги для этого?
1 ответ
Для 0.10.0 добавление ReaderParameters помогло с этим:
using (AssemblyDefinition a = AssemblyDefinition.ReadAssembly(file, new ReaderParameters { ReadWrite = true }))
{
var assemblyFileVersionCtor = a.CustomAttributes.Where(attribute => attribute.AttributeType.FullName == typeof(AssemblyFileVersionAttribute).FullName)
.FirstOrDefault();
if (assemblyFileVersionCtor != null)
{
assemblyFileVersionCtor.ConstructorArguments[0] = new CustomAttributeArgument(a.MainModule.TypeSystem.String, versionToSet.ToString());
a.Write();
}
}
Мне также пришлось установить для свойства InMemory объекта ReaderParameters значение true.
var rp = new ReaderParameters();
rp.ReadingMode = ReadingMode.Immediate;
rp.ReadWrite = true;
rp.InMemory = true;