我想用 ILSpy 反汇编整个 .NET 程序集。
我使用这段代码作为基础:
http://skysigal.xact-solutions.com/Blog/tabid/427/entryid/2488/Default.aspx http://skysigal.xact-solutions.com/Blog/tabid/427/entryid/2488/Default.aspx
它工作正常,只是当我有一个引用 Npgsql.dll(或任何其他非 gac 程序集)的程序集时,我会收到 AssemblyResolutionException。
无法解析程序集:“Npgsql,版本=2.0.11.92,文化=中性,PublicKeyToken=5d8b90d52f46fda7”
我知道如何获取引用的程序集,但如何将它们添加到 ast ?
// SqlWebAdmin.Models.Decompiler.DecompileAssembly("xy.dll");
public static string DecompileAssembly(string pathToAssembly)
{
//Assembly assembly = Assembly.LoadFrom(pathToAssembly);
System.Reflection.Assembly assembly = System.Reflection.Assembly.ReflectionOnlyLoadFrom(pathToAssembly);
//assembly.GetReferencedAssemblies();
//assembly.GetReferencedAssemblies(assembly);
Mono.Cecil.AssemblyDefinition assemblyDefinition =
Mono.Cecil.AssemblyDefinition.ReadAssembly(pathToAssembly);
ICSharpCode.Decompiler.Ast.AstBuilder astBuilder = new ICSharpCode.Decompiler.Ast.AstBuilder(new ICSharpCode.Decompiler.DecompilerContext(assemblyDefinition.MainModule));
astBuilder.AddAssembly(assemblyDefinition);
//new Helpers.RemoveCompilerAttribute().Run(decompiler.CompilationUnit);
using (System.IO.StringWriter output = new System.IO.StringWriter())
{
astBuilder.GenerateCode(new ICSharpCode.Decompiler.PlainTextOutput(output));
string result = output.ToString();
return result;
}
return "";
} // End Function DecompileAssembly
您需要告诉 ILSpy 正在使用的底层元数据读取器 Cecil,您的程序集在哪里。你可以写:
var resolver = new DefaultAssemblyResolver();
resolver.AddSearchDirectory("path/to/my/assemblies");
var parameters = new ReaderParameters
{
AssemblyResolver = resolver,
};
var assembly = AssemblyDefinition.ReadAssembly(pathToAssembly, parameters);
这是告诉 Cecil 在何处解析引用的程序集的最自然方式。这样,您可以删除使用 System.Reflection 加载程序集的行,并且仅使用 ILSpy 堆栈。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)