C# 使用Mono.Cecil编写程序集
我正在尝试使用Mono.Cecil写入当前加载到AppDomain的程序集,我不断收到一个IO错误,表示该文件正在使用中。我现在正在做的是使用AssemblyDefinition.Create()创建一个程序集,并进行所需的修改,然后使用AssemblyDefinition.Write()对程序集进行写入。根据我对Mono.Cecil的了解,应该可以在现有程序集上进行写操作,但是还有其他步骤吗?对于0.10.0,添加ReaderParameters有助于:C# 使用Mono.Cecil编写程序集,c#,.net,.net-assembly,mono.cecil,C#,.net,.net Assembly,Mono.cecil,我正在尝试使用Mono.Cecil写入当前加载到AppDomain的程序集,我不断收到一个IO错误,表示该文件正在使用中。我现在正在做的是使用AssemblyDefinition.Create()创建一个程序集,并进行所需的修改,然后使用AssemblyDefinition.Write()对程序集进行写入。根据我对Mono.Cecil的了解,应该可以在现有程序集上进行写操作,但是还有其他步骤吗?对于0.10.0,添加ReaderParameters有助于: using (AssemblyDefi
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;
加载的部件是锁定的部件。当程序集正在使用时,您不能覆盖它。一旦您修改了程序集,请卸载它并重新加载正确的程序集。@Asad您不能卸载程序集。你必须卸载整个AppDomain。@Lucastrezesniewski哦,好的。我想您可以将程序集加载到一个独立的AppDomain中,然后卸载/加载它。Mono.Cecil是一个MSIL解析器。与反射不同,它不会“将程序集加载到当前应用程序域”。是否为了其他目的而通过反射显式加载该程序集?如果是这样,则是.NET反射锁定了文件,您必须按照其他注释的指示卸载。