Mono.Cecil 修改目标.NET的IL代码保存时报异常的处理。

使用Mono.Cecil对目标.NET的DLL程序进行IL修改后保存时报“Failed to resolve assembly: xxxxxx, version=xxxxx,Culture=xxxxx,PublicKeyToken=xxxxxxx"异常。

使用DNSPY进行调试,原来是因为修改的目标DLL和本身程序不在同一个目录,当需要用到目标DLL引用的DLL时Mono.Cecil只在自身所在的目录进行搜索匹配,

找不到对应的DLL文件就会报上面的异常信息。

解决方法有两种:

第一个:只要将对应的DLL拷贝到程序自身所在目录即可解决。

第二个:在程序里增加Mono.Cecil可以搜索的目标目录。

DefaultAssemblyResolver resolver = new DefaultAssemblyResolver();
            resolver.AddSearchDirectory(info.DirectoryName); // 增加目标目录  

            ReaderParameters parameters = new ReaderParameters()
            {
                AssemblyResolver = resolver, // 将增加好目标目录的对象作为参数给AssemblyResolver
                ReadSymbols = false,
            };
            
            AssemblyDefinition asm = AssemblyDefinition.ReadAssembly(file, parameters); // 使用上面的参数即可完成对目标目录的指定及搜索
DefaultAssemblyResolver resolver = new DefaultAssemblyResolver(); resolver.AddSearchDirectory(info.DirectoryName); // 增加目标目录 ReaderParameters parameters = new ReaderParameters() { AssemblyResolver = resolver, // 将增加好目标目录的对象作为参数给AssemblyResolver ReadSymbols = false, }; AssemblyDefinition asm = AssemblyDefinition.ReadAssembly(file, parameters); // 使用上面的参数即可完成对目标目录的指定及搜索
使用Mono.Cecil对目标.NET的DLL程序进行IL修改后保存时报“Failed to resolve assembly: xxxxxx, version=xxxxx,Culture=xxxxx,PublicKeyToken=xxxxxxx"异常。 使用DNSPY进行调试,原来是因为修改的目标DLL和本身程序不在同一个目录,当需要用到目标DLL引用的DLL时Mono.Cecil只在自身所在的目录进行搜索匹配, 找不到对应的DLL文件就会报上面的异常信息。 解决方法有两种: 第一个:只要将对应的DLL拷贝到程序自身所在目录即可解决。 第二个:在程序里增加Mono.Cecil可以搜索的目标目录。 DefaultAssemblyResolver resolver = new DefaultAssemblyResolver(); resolver.AddSearchDirectory(info.DirectoryName); // 增加目标目录 ReaderParameters parameters = new ReaderParameters() { AssemblyResolver = resolver, // 将增加好目标目录的对象作为参数给AssemblyResolver ReadSymbols = false, }; AssemblyDefinition asm = AssemblyDefinition.ReadAssembly(file, parameters); // 使用上面的参数即可完成对目标目录的指定及搜索
经验分享 程序员 微信小程序 职场和发展