Запись поверх сборок с использованием 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;
Другие вопросы по тегам