Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Mono.Cecil编写程序集_C#_.net_.net Assembly_Mono.cecil - Fatal编程技术网

C# 使用Mono.Cecil编写程序集

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

我正在尝试使用Mono.Cecil写入当前加载到AppDomain的程序集,我不断收到一个IO错误,表示该文件正在使用中。我现在正在做的是使用AssemblyDefinition.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;

加载的部件是锁定的部件。当程序集正在使用时,您不能覆盖它。一旦您修改了程序集,请卸载它并重新加载正确的程序集。@Asad您不能卸载程序集。你必须卸载整个AppDomain。@Lucastrezesniewski哦,好的。我想您可以将程序集加载到一个独立的AppDomain中,然后卸载/加载它。Mono.Cecil是一个MSIL解析器。与反射不同,它不会“将程序集加载到当前应用程序域”。是否为了其他目的而通过反射显式加载该程序集?如果是这样,则是.NET反射锁定了文件,您必须按照其他注释的指示卸载。