使用 Mono.Cecil 重写程序集

Writing Over Assemblies Using Mono.Cecil

我正在尝试使用 Mono.Cecil 覆盖当前加载到 AppDomain 中的程序集,但我不断收到 IO 错误,提示该文件正在使用中。我现在正在做的是使用 AssemblyDefinitiion.Create() 创建一个程序集,进行我需要的任何修改,然后使用 AssemblyDefinition.Write() 覆盖程序集。据我了解 Mono.Cecil 应该可以覆盖现有的程序集,但是还有其他步骤吗?

对于 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();
    }
}

我还必须将 ReaderParameters 的 InMemory 属性 设置为 true。

var rp = new ReaderParameters();
rp.ReadingMode = ReadingMode.Immediate;
rp.ReadWrite = true;
rp.InMemory = true;